【问题标题】:Looping through all nodes in xml file with c#使用c#循环遍历xml文件中的所有节点
【发布时间】:2015-09-21 08:11:05
【问题描述】:

我有一个与此类似的设置的 xml 文档:

<invoice>
   <IssueDate>2015-09-07</IssueDate>
   <InvoiceType>380<InvoiceType>
   <AccountingSupplierParty>
        <Party>
             <EndpointID></EndpointID>
             <PartyName>
                  <Name>Company test</Name>
             </PartyName>
        </Party>
    </AccountingSupplierParty>
</invoice>

这只是整个 xml 文档的一小部分,只是为了展示文件的外观。

我也想检查所有元素是否有空值,例如本例中的 EndpointID(我需要将空值替换为 NA)。

这是我目前所拥有的:

public static void AddToEmptyElements()
{
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("testXml.xml");
    XmlNodeList nodes = xmlDoc.DocumentElement.ChildNodes;
    foreach (XmlNode node in nodes)
    {
        Console.WriteLine(node.Name);             
    }
}

但是,此代码只会循环遍历根节点的子节点,而不是所有孙子(或曾孙),例如 &lt;Party&gt;&lt;EndpointID&gt; 元素。如何在循环中包含这些元素?

【问题讨论】:

  • 是的,使用递归。
  • 附带说明,LINQ to XML 通常让生活变得更简单。 XmlDocument 绝对可以解决您的问题,但是如果您可以使用 LINQ to XML 代替,那将是单行...
  • 对于 xml 递归,我喜欢以下网站中用于将 xml 添加到树视图的代码。之前多次使用该代码。 stackoverflow.com/questions/28976601/…

标签: c# xml xmldocument


【解决方案1】:

我现在不在测试代码的环境中,但是是否可以编写递归方法来进一步循环节点?

类似这样的东西(未经测试的代码):

private static void handleNode(XmlNode node)
{
  if(node.HasChildNodes)
  {
    foreach(XmlNode child in node.ChildNodes)
    {
      handleNode(child);
    }
  }  
  else
    Console.WriteLine(node.Name);
}

然后调用此方法代替您的 Console.WrintLine()

【讨论】:

    【解决方案2】:

    正如 Jon Skeet 已经说过的,您可以使用 LINQ to XML 来做到这一点。

    XDocument xml = XDocument.Load(path);
    var emptyElements = xml.Descendants().Where(xe => String.IsNullOrEmpty(xe.Value));
    foreach (var xe in emptyElements)
       xe.Value = "NA";
    

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多