簡體   English   中英

在C#中一次從xml文件讀取元素中的某些節點

[英]Reading certain nodes from elements one at a time of xml file in c#

我正在嘗試通讀.xml -file並從那里獲取信息。 這是我擁有的.xml -file的示例:

<?xml version="1.0" encoding="UTF-8"?>
<XmlFile>
  <xmlsource>
    <Name>TestXml</Name>
    <filename>MyXmlFile.xml</filename>
    <Information Key="GeneralInfo"/>
    <Products>
        <Product>
            <ProductName>Product1</ProductName>
            <Name Key="SomeName"/>
            <Usages>
                <Usage>
                    <Specs>
                        <Spec1 Key="Moving"/>
                        <Spec2 Key="Lifting"/>
                    </Specs>
                    <Info1>
                        <MovingInfo1>yes</MovingInfo1>
                    </Info1>
                    <Info2>Noup</Info2>
                    <MoreSpecs>
                        <ProductModel1>
                            <DetInfo1>DetInfo1</DetInfo1>
                            <DetInfo2>DetInfo2</DetInfo2>
                        </ProductModel11>
                    </MoreSpecs>
                </Usage>
            </Usages>
        </Product>
        <Product>
            <ProductName>Product2</ProductName>
            <Name Key="SomeName2"/>
            <Usages>
                <Usage>
                    <Specs>
                        <Spec1 Key="Moving"/>
                        <Spec2 Key="Lifting"/>
                    </Specs>
                    <Info1>
                        <MovingInfo1>not</MovingInfo1>
                    </Info1>
                    <Info2>Yes</Info2>
                    <MoreSpecs>
                        <ProductModel1>
                            <DetInfo1>DetInfo1</DetInfo1>
                        </ProductModel1>
                    </MoreSpecs>
                </Usage>
                <Usage>
                    <Specs>
                        <Spec1 Key="Turning"/>
                    </Specs>
                    <Info1>
                        <TurningInfo1>Infoooo</TurningInfo1>
                    </Info1>
                    <Info2>No</Info2>
                    <MoreSpecs>
                        <ProductType1>
                            <DetInfo1>DetInfo1</DetInfo1>
                        </ProductType1>
                    </MoreSpecs>
                </Usage>
            </Usages>
        </Product>
    </Products>
</xmlsource>

(這只是一個示例,原始文件中包含很多數據。)

我只想知道ProductNameSpec1的值。 正如你可以從樣本看,“產品2”有兩個不同的值Spec1 :“移動”和“轉向”。

我想要達到的目標

從第一個<Product>讀取ProductName (“ Product1”),然后從Spec1 (“ Moving”)中Spec1 ,然后對信息進行一些處理。 之后,移至下一個<Product> ,讀取ProductName (“ Product2”), Spec1 (“ Moving”)和其他Spec1 (“ Turning”),並跳過所有其他可能的Spec值-意味着我只想要Spec1值。 依此類推,通過孔文件。

這是我嘗試做的事情:

public void getNodes(string filepath)
    {
        xmlFilePath = filepath;
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load(xmlFilePath);
        XmlNodeList products = xDoc.SelectNodes("//Product");
        XmlNodeList productnames = xDoc.SelectNodes("//Product/ProductName");
        XmlNodeList specs = xDoc.SelectNodes("//Product//Spec1");

        AllocConsole();

        Console.WriteLine(products.Count);
        Console.WriteLine(specs.Count);

        foreach (XmlNode xn in specs)
        {
            XmlAttributeCollection spec1Atts = xn.Attributes;
            Console.WriteLine(spec1Atts["Key"].Value.ToString());
        }

        for (int i = 0; i < products.Count; i++)
        {
            Console.WriteLine(products.Item(i).InnerText);
            Console.ReadLine();
        }
    }

這是我所擁有的最接近(最接近我想要做的)。

在那里,首先我加載了.xml -file。

然后,在包含XmlNodeList等的行中。我正在過濾這些要求。

在這里(下)正在檢查產品規格的數量:

Console.WriteLine(products.Count);
Console.WriteLine(specs.Count);

最后,我將打印出已讀取的值。 這樣,打印輸出顯然是:

  • 先出金額
  • 其次是規格
  • 最后是產品名稱

如上所述,我希望將ProductNamesSpec1's鏈接在一起。

我嘗試了許多方法,例如,如此處所示: 讀取xml文件的多個子節點

在某種情況下,我無法以某種方式發揮作用。 也許是因為在我的情況下,父母對如此之多?

我無法更改.xml -file的結構。 如果可以的話,我已經改變了...

所以,我的問題是:有人可以給我一個提示/方式來實現我的目標嗎? 提前致謝。

如果我正確理解了您的問題,則您正在嘗試檢索每種產品的規格,並且希望將它們一起使用。 (如果無法完全理解,我深表歉意)。 如果是這種情況,您可以嘗試在示例循環中直接探查product元素。 喜歡

 for (int i = 0; i < products.Count; i++) {
   var specs = products[i].SelectNodes("Usages/Usage/Specs")[0].ChildNodes;
     for (int j = 0; j < specs.Count; j++)
         Console.WriteLine("{0}->{1}", products[i].FirstChild.InnerText, specs[j].Attributes["Key"].Value);
 }

我希望這有幫助

您需要做的是遍歷層次結構。 在下面的修訂代碼中,找到ProductName,然后其中查找下一個節點,依此類推,直到找到與該產品相對應的規格。

    private static void getNodes(string filePath)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(filePath);
        var productNodes = xmlDoc.SelectNodes("//Product");
        if (productNodes != null)
        {
            foreach (XmlNode product in productNodes)
            {
                var childNodes = product.ChildNodes;
                foreach (XmlNode child in childNodes)
                {
                    if (child.Name == "ProductName")
                    {
                        Console.WriteLine(child.InnerText);
                    }
                    else if (child.Name == "Usages")
                    {
                        var childNodes2 = child.ChildNodes;
                        foreach (XmlNode child2 in childNodes2)
                        {
                            if (child2.Name == "Usage")
                            {
                                var childNodes3 = child2.ChildNodes;
                                foreach (XmlNode child3 in childNodes3)
                                {
                                    if (child3.Name == "Specs")
                                    {
                                        var childNodes4 = child3.ChildNodes;
                                        foreach (XmlNode child4 in childNodes4)
                                        {
                                            foreach (XmlNode a in child4.Attributes)
                                            {
                                                Console.WriteLine($"  {a.InnerText}");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        Console.ReadLine();
    }

希望能有所幫助。 如果是這樣,請投票給我,因為我需要聲譽。 謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM