使用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";
我有一个 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";