XElement节点和子节点

时间:2016-06-27 15:16:27

标签: c# xml excel xelement

如果重复这个问题,我很抱歉,但是从我的搜索中找不到我的特定错误的适当答案。

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

因此对于xml结构:

xml有几个字段,每个字段中都有一个标签和值字段。所以我采取了这条路线来创建所有节点(例如,字段)的列表,并尝试使用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();
                             }
                    }                           
            }
    }

我开始对命名转换和获取数据的对象类型感到困惑。

示例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>

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

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

1 个答案:

答案 0 :(得分:2)

我相信这样的事可能适合你。由于您的字段中似乎有重复的标签(例如&#34;&lt; label&gt;名称&lt; / label&gt;&#34;出现两次),我在这里使用了FirstOrDefault。你应该调查为什么有重复并适当处理。如果没有重复项,SingleOrDefault将是更好的选择。

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中的null-conditional operator(Visual Studio 2015+)。