XElement节点和子节点

如果这个问题已经重复,我很抱歉,但从我的search没有任何适当的答案,我的特定错误。

所以对于这个问题,我目前已经在电子表格中有了几行XML的excel文档。 我现在正在做的是在C#中创build一个控制台应用程序,然后将XML过滤为可读数据。 我目前能够提取文档内容,现在我正在运行代码来分解数据。

所以对于XML结构:

xml有几个字段,在每个字段中都有一个标签和值字段。 所以我已经采取了创build所有节点(例如域)的列表,并尝试使用XElement提取数据。 另外我知道所有的标签,所以我会做的是使用标签来尝试收集的价值。

foreach(DataRow row in result.Tables[0].Rows) { var XmlData = row.ItemArray[2].ToString(); XElement doc = XElement.Parse(XmlData); foreach (XElement element in doc.Elements("fields")) { var userEntry = new FieldEntryModel(); //element.Value.ToList(); var elementNodes = element.Nodes().ToList(); var nodeBreakdown = element.Nodes().OfType<XElement>(); foreach (var something in nodeBreakdown) { var willthiswork = something.DescendantNodes().OfType<XElement>(); foreach (var item in willthiswork) { if (item.Value != null) { if (item.Value.ToString().Contains("Forename")) //Console.WriteLine(item..ToString()); //userEntry.Forename = item.Value.ToString(); } } } } 

我开始混淆命名转换和对象types来获取数据。

示例XML:

 <fields> <field> <label> Name <label> <value> Test </value> </field> <field> <label> job <label> <value> developer </value> </field> <field> <label> address <label> <value> 1 Test </value> </field> <field> <label> Name <label> <value> Test </value> </field> </fields> 

然后我会将这些数据存储在我的字段input模型中,这样就是:

  public class FieldEntryModel { public string Name {get;set;} public string Job {get;set;} public string Address{get;set;} } 

我相信这样的东西可能适合你。 由于您的字段中似乎有重复的标签(例如“<label> Name </ label>”出现两次),所以我在这里使用了FirstOrDefault 。 你应该调查为什么有重复和适当处理。 如果没有重复, SingleOrDefault将是更好的select。

 var fieldElements = doc.Elements("fields").Elements("field"); var nameElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "Name"); var jobElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "job"); var addressElement = fieldElements.FirstOrDefault(e => e.Element("label")?.Value == "address"); var model = new FieldEntryModel { Name = nameElement?.Element("value")?.Value, Job = jobElement?.Element("value")?.Value, Address = addressElement?.Element("value")?.Value, }; 

请注意,我在这里使用了C#6(Visual Studio 2015+)中的空条件运算符 。