2015-08-20 48 views
0

我有這個XML,我迷路了,請任何人都可以幫忙?xml c#多個記錄

<?xml version = "1.0" encoding = "utf-8"?> 
<root> 
    <batch> 
    <field level = "batch" name = "VoucherNumber" value = "00018"/> 
    <field level = "batch" name = "FinancialYear" value = "1996"/> 
    <field level = "batch" name = "CountNumber" value = "00018"/> 
    <field level = "batch" name = "CountDate" value = "1416-08-16"/> 
    <field level = "batch" name = "Total" value = "214000.0"/> 
    <field level = "batch" name = "CuttOf" value = "0.0"/> 
    <field level = "batch" name = "Net" value = "214000.0"/> 
    <field level = "batch" name = "Comment" value = "1"/> 
    <field level = "batch" name = "DailyNumber" value = "00018"/> 
    <field level = "batch" name = "DailyDate" value = "1416-09-01"/> 
    <field level = "batch" name = "Year" value = "1416"/> 
    <field level = "batch" name = "Section" value = "1"/> 
    </batch> 
</root> 

我試圖提取所有名稱和值並返回它們,我的代碼如下:

private string ReadXML(string filename) 
{ 
string str = ""; 
XmlDocument doc = new XmlDocument(); 
doc.Load(filename); 
XmlNodeList nodelist = doc.SelectNodes("/root/batch"); 
foreach (XmlNode node in nodelist) 
{ 
str += node["name"].InnerText + node["value"].InnerText; 
} 
return str; 
} 
+0

可能重複[閱讀XML屬性使用XmlDocument](http://stackoverflow.com/questions/933687/read-xml-attribute-using-xmldocument) – MethodMan

回答

0

「名」和「價值」是XML節點的屬性。要訪問它們:

​​

所以,這條線應該是這個樣子:

str += node.Attributes["name"].Value + node.Attributes["value"].Value; 
+0

謝謝。這樣可行。我只需要做一點改動就可以在XmlNodeList中包含字段節點nodelist = doc.SelectNodes(「/ root/batch/field」) –

0

我發現LinqToXml更容易使用

var dict = XDocument.Load(filename) 
      .Descendants("field") 
      .ToDictionary(f => f.Attribute("name").Value, f => f.Attribute("value").Value); 


foreach(var kv in dict) 
{ 
    Console.WriteLine(kv.Key + " " + kv.Value); 
} 
+0

很棒。我想使用你的代碼,但是我可以首先知道它的執行速度是否比我的代碼快?因爲我需要在數百萬個文檔上運行它。 –

+0

@AbdH。 http://ericlippert.com/2012/12/17/performance-rant/ – Eser

0

你需要改變你的選擇的節點,尋找現場節點。您還需要訪問你的foreach循環節點的屬性,這將是這個樣子:

XmlNodeList nodelist = doc.SelectNodes("/root/batch/field"); 
foreach (XmlNode node in nodelist) 
{ 
    str += node.Attributes["name"].InnerText + node.Attributes["value"].InnerText; 
} 

您還可以更改.InnerText.Value,但兩者都爲我工作。

0

的XDocument也可以用來代替的XMLDocument:

private string ReadXML(string filename) 
{ 
    string str = ""; 
    XDocument doc = XDocument.Load(filename); 
    IEnumerable<XElement> rows = doc.Root.Descendants("field"); 
    foreach (XElement node in rows) 
    { 
     str += node.Attribute("name").Value + node.Attribute("value").Value; 
    } 
    return str; 
} 

你可以在這裏嘗試一下:https://dotnetfiddle.net/CaQ6T2

0

我會去與LinqToXml做這樣的:

private string ReadXML(string filename) 
{ 
    return String.Join("", 
     from d in XDocument.Load(filename).Descendants("field") 
     let name = d.Attribute("name").Value 
     let value = d.Attribute("value").Value 
     from x in new [] { name, value } 
     select x); 
}