[英]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>
如何從特定的Data
, SubjectData
, SEventData
, FormData
, ItemGroupData
或ItemData
將項目及其值存儲在網格中?
這是我為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.