Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用可变父标记解析XmlDocument_C#_.net_Xmldocument - Fatal编程技术网

C# 使用可变父标记解析XmlDocument

C# 使用可变父标记解析XmlDocument,c#,.net,xmldocument,C#,.net,Xmldocument,假设我有这样一个XML文档: <xmlFile> <details> <code1>ADJ</code1> <code2>ADC </code2> <Shipment> <foo></foo> <bar></bar> </Shipment> <Shipment>

假设我有这样一个XML文档:

<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");