【问题标题】:XML parsing a subtree in C#XML解析C#中的子树
【发布时间】:2020-11-16 22:13:48
【问题描述】:

我有许多需要解析的 xml 文件。 xml 文件是从其他地方加载的。我可以检查这些文件以获取提取所需数据所需的路径。路径不一样。 所以我在一个ini文件中为每个xml文件添加了路径。这适用于 6 个文件中的 5 个。

WebClient client = new WebClient();
data = client.DownloadData("ftp://some.site/my.xml");
MemoryStream stream = new MemoryStream(data);
XmlDocument xml_doc = new XmlDocument();
xml_doc.Load(stream);
var prod_ids = xml_doc.DocumentElement.SelectNodes("/Catalog/Products/Product/Product_Id/text()");
foreach (XmlNode node in prod_ids) {
  [...]
}

在最后一个文件中,我需要一次从一个子树中获取 2 个信息,因为我必须将它们组合成一个字符串,因此单独读取所有节点是行不通的。请参阅示例-XML:

<Catalog>
  <Created><![CDATA[2020-11-16T00:22:11+01:00]]></Created>
  <Products>
    <Product>
        <Product_Id><![CDATA[ABC]]></Product_Id>
        <Color_Code><![CDATA[123]]></Color_Code>
        <Size><![CDATA[]]></Size>
        <Length>210</Length>
        <Width>0</Width>
    </Product>
    <Product>
        <Product_Id><![CDATA[ABC]]></Product_Id>
        <Color_Code><![CDATA[456]]></Color_Code>
        <Size><![CDATA[]]></Size>
        <Length>44</Length>
        <Width>55</Width>
    </Product>
    <Product>
        <Product_Id><![CDATA[XYZ]]></Product_Id>
        <Color_Code><![CDATA[123]]></Color_Code>
        <Size><![CDATA[]]></Size>
        <Length>150</Length>
        <Width>11</Width>
    </Product>
  </Products>
</Catalog>
        

我正在寻找一些代码来解析每个子树(/Catalog/Products/Product),我可以在其中从 Product_Id 和 Color_Code 读取 innerText 以将它们组合成一个字符串。 有什么想法吗?

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    您真的很接近,但您在 DOM 树中的位置太低了。不要循环遍历每个 Product/ProductID,而是从每个 Product 开始循环,然后在循环中获取每个 ProductID/ColorCode。

    foreach( XmlElement ndProduct in xml.SelectNodes( "//Product") ) {
        XmlElement ndProductID = (XmlElement)ndProduct.SelectSingleNode("Product_Id");
        string strProductID = ndProductID.InnerText;
    
        XmlElement ndColorCode = (XmlElement)ndProduct.SelectSingleNode("Color_Code");
        string strColorCode = ndColorCode.InnerText;
    
        string strReturn = strProductID + " - " + strColorCode;
    }
    

    【讨论】:

    • 非常感谢。这很简单。我会在以后的项目中记住这一点。
    【解决方案2】:

    使用更现代的 linq to xml。

    var doc = XDocument.Load(stream);
    
    var values = doc.Root
        .Element("Products")
        .Elements("Product")
        .Select(p => p.Element("Product_Id").Value + p.Element("Color_Code").Value);
    
    foreach (var value in values)
        Console.WriteLine(value);
    

    我可以提供以下解决方案。

    使用OR操作|获取不同节点的值。

    然后我们以 2 为增量遍历集合并组合这些值。

    var prod_ids = xml_doc.DocumentElement.SelectNodes(
        "/Catalog/Products/Product/Product_Id | /Catalog/Products/Product/Color_Code");
    
    for (int i = 0; i < prod_ids.Count; i += 2)
        Console.WriteLine(prod_ids[i].InnerText + prod_ids[i + 1].InnerText);
    

    【讨论】:

    • 疯了。很高兴知道我可以使用“OR”。
    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多