通过c#读取xml的多个子节点

Posted

技术标签:

【中文标题】通过c#读取xml的多个子节点【英文标题】:Read multiple child nodes of xml via c# 【发布时间】:2020-12-18 00:05:50 【问题描述】:
<Products>
 <Product>
      <Product_code>
           <![CDATA[ 9.077 ]]>
      </Product_code>
      <Price2>799.99</Price2>
                <variants>
                          <variant>
                                    <spec name="Renk">White</spec>
                                    <productCode>
                                              <![CDATA[ 9.0771933 ]]>
                                    </productCode>
                                    <picture>
                                              <![CDATA[ image/data/resimler/hakiki-deri-cz-saracli-topuklu-kadin-cizme-8316.jpg ]]>
                                    </picture>
                                    <picture>
                                              <![CDATA[ image/data/resimler/hakiki-deri-cz-saracli-topuklu-kadin-cizme-8314.jpg ]]>
                                    </picture>
                          </variant>
                          <variant>
                                    <spec name="Renk">Black</spec>
                                    <productCode>
                                              <![CDATA[ 9.0771734 ]]>
                                    </productCode>
                                    <picture>
                                              <![CDATA[ image/data/resimler/hakiki-deri-cz-saracli-topuklu-kadin-cizme-8316.jpg ]]>
                                    </picture>
                                    <picture>
                                              <![CDATA[ image/data/resimler/hakiki-deri-cz-saracli-topuklu-kadin-cizme-8314.jpg ]]>
                                    </picture>
                          </variant>
                </variants>
      </Product>
</Products>

这是我的 XML 示例: 这是关于带有Product CodeColorVariant CodePicture 的产品

我想先获得Product_codes,然后是Product_code中的所有Variants

例如:


产品代码: 9.077

价格2: 799.99


伦克:白色

产品代码: 9.0771933

图片1:链接1

图片2:链接2


伦克:黑色

产品代码: 9.0771734

图片1:链接1

图片2:链接2

XmlDocument xmlDoc = new XmlDocument();
        XmlDocument xDoc = new XmlDocument();
        xmlDoc.Load("eticaret.xml");
        XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes("/Products/Product");

        foreach (XmlNode tu in xmlDoc.SelectNodes("/Products/Product"))
        
            MessageBox.Show("tu = " + tu.SelectSingleNode("Product_code").InnerText);
            foreach (XmlNode tuv in tu.SelectNodes("/Products/Product/variants/variant"))
            

                MessageBox.Show("tuv = " + tuv.SelectSingleNode("productCode").InnerText + "   -   " + tuv.SelectSingleNode("spec[@name='Renk']").InnerText;
            
        

我用过这段代码

它确实有效,但是: 首先给出第一部分的信息 以下仅显示产品变体 它不再显示第一个信息

【问题讨论】:

欢迎来到 Stack Overflow!您能否向我们展示您已经尝试过的方法以及您遇到的具体问题? 我使用“foreach XmlNode”获取(Product_code:9.077 和 Price2:799.99)然后我认为我应该使用第二个 foreach 来获取(Product_code:9.077)的(Renk,productCode,picture1,picture2) 反序列化 Xml 是选项之一。 This stack overflow link will help you 请将您的尝试作为格式化代码添加到您的问题中。 Biju Kalanjoor,我这样做,没关系,但问题出在第二个子节点(Renk,productCode,picture1,picture2)总产品:1233 每个产品有 5 或 5 个变体 【参考方案1】:

这行有问题:

foreach (XmlNode tuv in tu.SelectNodes("/Products/Product/variants/variant"))

它从所有产品中选择所有变体,而不仅仅是当前tu节点下的变体。 将其更改为:

foreach (XmlNode tuv in tu.SelectNodes("variants/variant"))

这将选择相对于当前tu 节点的节点。

要选择图片,可以使用以下代码:

foreach (XmlNode picture in tuv.SelectNodes("picture"))

    Console.WriteLine("  " + picture.InnerText);

【讨论】:

对于(图片)我该怎么办?该变体有 2 或 3 张具有相同属性的图片 看我回答的最后一段【参考方案2】:

使用 xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        
            XDocument doc = XDocument.Load(FILENAME);

            List<Product> products = doc.Descendants("Product")
                .Select(x => new Product()
                
                    code = (string)x.Element("Product_code"),
                    price = (decimal)x.Element("Price2"),
                    variants = x.Descendants("variant")
                       .Select(y => new Variant()
                       
                           renk = (string)y.Element("spec"),
                           code = (string)y.Element("productCode"),
                           urls = y.Elements("picture").Select(z => (string)z).ToList()
                       ).ToList()
                ).ToList();

        
    
    public class Product
    
        public string code  get; set; 
        public decimal price  get; set;
        public List<Variant> variants  get; set;

    
    public class Variant
    
        public string renk  get; set; 
        public string code  get; set; 
        public List<string> urls  get; set; 
    

【讨论】:

以上是关于通过c#读取xml的多个子节点的主要内容,如果未能解决你的问题,请参考以下文章

C#读取xml

从 C# 中的大 xml 读取子节点值

在c#的winform 下怎么读取 xml文件中的数据?

java 如何读取xml文件中的一个节点下的多个相同子节点

读取具有多个名称空间的子节点

无法在 C# 中读取 XML 节点