我正在尝试通读.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>
(这只是一个示例,原始文件中包含更多数据。)
我只想知道ProductName
和Spec1
的值。从样本中可以看出,'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);
最后我打印出已读取的值。有了这个,打印输出显然是:
如上所述,我希望ProductNames
和Spec1's
“联系”在一起。
我尝试了很多方法,例如如下所示:Reading multiple child nodes of xml file
不知怎的,我无法在我的情况下做任何示例。也许是因为在我的情况下,有如此深的亲子对?
我无法更改.xml -file的结构。如果可以,我会改变它......
所以,我的问题是:有人能告诉我如何实现目标吗?提前谢谢。
答案 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();
}
希望有所帮助。如果是这样,请投票给我答案,因为我需要声誉。谢谢。