簡體   English   中英

c#解析XML並將節點存儲到網格

[英]c# Parse XML and store nodes to grid

這是我從請求中獲得的XML

<ODM xmlns:.....>
    <Data DID="Mdid">
         <SubjectData SubjectKey="1">
               <SRef Location="Loc1"/>
               <SEventData SEventID="SID1">
                    <FormData FormID="FID1">
                          <ItemGroupData ItemGroupID="IGID1">
                                <ItemData ItemID="IID1" IsNull="Yes"/>
                                <ItemData ItemID="IID2" IsNull="Yes"/>
                                <ItemData ItemID="IID3" IsNull="Yes"/>
                                <ItemData ItemID="IID4" Value="cvs"/>
                          </ItemGroupData>
                    </FormData>
                </SEventData>
          </SubjectData>
     </Data>
     <Data DID="Zdid">
           <SubjectData SubjectKey="2">
               <SRef Location="Loc2"/>
               <SEventData SEventID="SID2">
                    <FormData FormID="FID2">
                          <ItemGroupData ItemGroupID="IGID2">
                                <ItemData ItemID="IID11" Value="xcs"/>
                                <ItemData ItemID="IID12" IsNull="Yes"/>
                                <ItemData ItemID="IID13" IsNull="Yes"/>
                                <ItemData ItemID="IID14" Value="zfv"/>
                          </ItemGroupData>
                    </FormData>
                </SEventData>
          </SubjectData>
     </Data>
          ........
</ODM>

如何從特定的DataSubjectDataSEventDataFormDataItemGroupDataItemData將項目及其值存儲在網格中?

這是我為ItemData嘗試過的方法,但它返回null

var xdoc = XDocument.Parse(response.RawXMLString());

var items = xdoc.Descendants("ItemData")
           .ToDictionary(i => (string)i.Attribute("ItemID"),
                         i => (string)i.Attribute("Value"));

“ Mdid”數據項(對於SubjectKey == 1, SEventID =“ SID1”等將是相同的。但是“ Zdid”數據項將有所不同,因為它可能包含不同的ItemData ):

 ItemID    |    IsNull   |  Value
  IID1     |      Yes    |
  IID2     |      Yes    |
             ......

編輯

不幸的是,這兩個解決方案都無法正常工作……如果有幫助,這里是我正在處理的示例XML: 鏈接

基於注釋中的討論,此代碼將把ItemData元素解析為一個列表,但是將丟失有關它們來自Mdid還是Zdid部分的上下文:

首先是一個保存項目數據的類:

public class ItemData
{
    public string ItemID { get; set; }
    public string IsNull { get; set; }
    public string Value { get; set; }
}

和Linq處理XML:

var items = xdoc
    .Descendants("Data")
    .Where(d => d.Attribute("DID").Value == "Mdid") //These lines can be added
    .Descendants("ItemData")                        //to filter if you need them
   .Select(i => new ItemData
   {
       ItemID = (string)i.Attribute("ItemID"),
       IsNull = (string)i.Attribute("IsNull"),
       Value = (string)i.Attribute("Value")
   }); 

如果需要包括名稱空間,請按照以下步驟操作:

XNamespace ns = "http://www.cdisc.org/ns/odm/v1.3";

然后在名稱前加上`ns。 例如:

.Descendants(ns+"ItemData") 

如果失敗,則可能會有多個具有相同值的ItemData。 嘗試以下操作:

           XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, string> items = doc.Descendants().Where(x => x.Name.LocalName == "ItemData")
                .GroupBy(x => (string)x.Attribute("ItemOID"), y => y.Attribute("IsNull") != null ? "Null" : (string)y.Attribute("Value"))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

            //if above fails tgry following
            Dictionary<string, List<string>> items2 = doc.Descendants().Where(x => x.Name.LocalName == "ItemData")
                .GroupBy(x => (string)x.Attribute("ItemOID"), y => y.Attribute("IsNull") != null ? "Null" : (string)y.Attribute("Value"))
                .ToDictionary(x => x.Key, y => y.ToList());

            //or use two level dictionary
            Dictionary<int, Dictionary<string, string>> items3 = doc.Descendants().Where(x => x.Name.LocalName == "SubjectData")
                .GroupBy(x => (int)x.Attribute("SubjectKey"), y => y.Descendants().Where(z => z.Name.LocalName == "ItemData")
                    .GroupBy(a => (string)a.Attribute("ItemOID"), b => b.Attribute("IsNull") != null ? "Null" : (string)b.Attribute("Value"))
                    .ToDictionary(a => a.Key, b => b.FirstOrDefault()))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM