C# 使用可变父标记解析XmlDocument
假设我有这样一个XML文档:C# 使用可变父标记解析XmlDocument,c#,.net,xmldocument,C#,.net,Xmldocument,假设我有这样一个XML文档: <xmlFile> <details> <code1>ADJ</code1> <code2>ADC </code2> <Shipment> <foo></foo> <bar></bar> </Shipment> <Shipment>
<xmlFile>
<details>
<code1>ADJ</code1>
<code2>ADC </code2>
<Shipment>
<foo></foo>
<bar></bar>
</Shipment>
<Shipment>
<foo></foo>
<bar></bar>
</Shipment>
</details>
<details>
<code1>ADJ</code1>
<code2>SCC </code2>
<Shipment>
<foo></foo>
<bar></bar>
</Shipment>
</details>
</xmlFile>
我不知道下一步该怎么办。谢谢。假设Data\Sample.xml包含问题中提到的xml,
以下是XLINQ查询
XElement root = XElement.Parse(File.ReadAllText(@"Data\Sample.xml"));
var adcShipment = root.Descendants().Where(e=>String.Equals(e.Value, "ADC "));
//next query for nodes/elements inside/next to ADC shipments
这就是你想要的那种东西
XmlNodeList details = xml.GetElementsByTagName("details");
foreach (XmlNode node in details)
{
if (node["code2"].InnerText.Trim() == "ADC")
{
// Get each shipment and process it accordingly.
foreach(XmlNode shipment in node.SelectNodes("Shipment"))
{
var foo = shipment.SelectSingleNode("foo");
var bar = shipment.SelectSingleNode("bar");
}
}
}
XPath可以简化对匹配项的搜索:
foreach (XmlNode node in xml.SelectNodes("/xmlFile/details[normalize-space(code2)='ADC']"))
{
string foo = node.SelectSingleNode("foo").InnerText;
string bar = node.SelectSingleNode("bar").InnerText;
}
我正在将XPath解析添加到此库中: 我对其进行了修改,以便您可以执行以下操作:
XElement root = XElement.Load(file);
var shipments = root.XPath("details[starts-with(*,'ADC')]/Shipment");
长柄,看起来像:
var shipments = root.Elements("details")
.Where(x => x.Elements().Any(xx => ((string)xx).StartsWith("ADC")))
.Elements("Shipment");
“在”=“在文本中”或“的孩子”下?(所有的
都没有有意义的子项)您可以使用XDocument和LINQ吗?您将如何使用LINQ和XDocument实现它?现有代码库使用所有XmlDocuments。第一个详细信息的代码2是“ADC”而不是“ADC”,因此它不匹配。出于某种原因,在我运行foreach循环时,它没有捕获XmlNode装运。有没有想过为什么它看不到任何东西?@ShawnH。Chuck的观察是正确的,XML元素值以空格字符结尾。我修改了代码以忽略这个尾随空格字符。现在对你有用吗?那是我打字的错误。XML应该有这样的空间。我将调整这个问题。
var shipments = root.Elements("details")
.Where(x => x.Elements().Any(xx => ((string)xx).StartsWith("ADC")))
.Elements("Shipment");