[英]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>
(這只是一個示例,原始文件中包含很多數據。)
我只想知道ProductName
和Spec1
的值。 正如你可以從樣本看,“產品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);
最后,我將打印出已讀取的值。 這樣,打印輸出顯然是:
如上所述,我希望將ProductNames
和Spec1'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.