使用c#循环遍历xml文件中的所有节点

Looping through all nodes in xml file with c#

我有一个 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);             
    }
}

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

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

像这样(未经测试的代码):

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

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

正如 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";