在c#

时间:2016-06-02 20:39:32

标签: c# xml wpf

我正在尝试通读.xml -file并从中获取信息。这是我的.xml文件的示例:

<?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的值。从样本中可以看出,'Product2'有两个不同的Spec1值:'Moving'和'Turning'。

我想要实现的目标

从第一个ProductName读取<Product>(“Product1”),然后读取Spec1(“移动”),然后对信息执行某些操作。之后,转到下一个<Product>,阅读ProductName(“Product2”),Spec1(“移动”)和另一个Spec1(“转动”),并跳过所有其他可能的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文件。

然后,在包含XmlNodeList等的行中,我正在过滤这些要求。

此处(下方),正在检查产品规格数量:

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

最后我打印出已读取的值。有了这个,打印输出显然是:

  • 首先出现金额
  • 第二个是规格
  • 最后是产品名称

如上所述,我希望ProductNamesSpec1's“联系”在一起。

我尝试了很多方法,例如如下所示:Reading multiple child nodes of xml file

不知怎的,我无法在我的情况下做任何示例。也许是因为在我的情况下,有如此深的亲子对?

我无法更改.xml -file的结构。如果可以,我会改变它......

所以,我的问题是:有人能告诉我如何实现目标吗?提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您正在尝试检索每个产品的规格,并希望将它们一起使用。 (道歉,如果我没有完全得到它)。如果是这种情况,您可以尝试直接在示例循环中探测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);
 }

我希望这会有所帮助

答案 1 :(得分:2)

您需要做的是遍历层次结构。在下面的修订代码中,我找到ProductName,然后 ,我会查找下一个节点,依此类推,直到找到与该产品对应的规格。< / p>

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

希望有所帮助。如果是这样,请投票给我答案,因为我需要声誉。谢谢。