使用变量父标记解析XmlDocument

时间:2012-05-14 15:29:38

标签: c# .net xmldocument

假设我有一个像这样的XmlDocument:

<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>

我需要在xml文件中处理每个文件,但只包含属于标记的货件,其子节点的值为“ADC”。到目前为止,我有:

// Assume there is an XmlDocument named xml 
XmlNodeList details= xml.GetElementsByTagName("details");

foreach (XmlNode node in details)
{
   if (node["code2"].InnerText == "ADC ")
   {
   // Get each shipment and process it accordingly.
   }
}

我无法弄清楚下一步该做什么。感谢。

4 个答案:

答案 0 :(得分:0)

假设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

答案 1 :(得分:0)

这是你想要的事情

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

答案 2 :(得分:0)

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;
}

答案 3 :(得分:0)

我正在将XPath解析添加到此库中:https://github.com/ChuckSavage/XmlLib/

我修改了它,所以你可以这样做:

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