2012-10-11 107 views
1

我想解析一些XML在我的程序中,但我似乎無法找出最好的方式來做到這一點。使用XML獲取具有相同名稱的所有元素的內容?

XML有一個名爲「容器」的元素。這個元素有多個名爲「text」的後代。我想要做的是按順序提取「text」元素中的值,並將其保存爲字符串。

所以XML看起來像:

<containers> 
    <container> 
     <elt3243> </elt3243> 
     <elt1122></elt1122> 
     <elt><text> Put me in a string please </text> </elt> 
     <elt2211></elt2211> 
    </container> 
    <container> 
     <elt3243><text>I would also like to be in the string</text></elt3243> 
     <elt1122></elt1122> 
     <elt> </elt> 
     <elt2211></elt2211> 
    </container> 
</containers> 

而結果我想:

String result = "Put me in a string please \n I would also like to be in the string"; 

什麼是這樣做的最佳方式?

+0

這可能是在'XmlDocument'嗎? – LukeHennerley

回答

2
XDocument doc = XDocument.Load(file.FullName); 
var strings = doc.Descendants("container").SelectMany(x => x.Descendants("text")).ToList(); 
return strings.Join(" \n "); 
0

您可以使用XPath,請參閱MSDN以瞭解更多信息。

所以,這樣的事情:

XPathDocument document = new XPathDocument(<Source of your XML >); 
XPathNavigator navigator = document.CreateNavigator(); 

XPathNodeIterator nodes = navigator.Select("//text"); 

string result = ""; 
while (nodes.MoveNext()) 
{ 
    result += nodes.Current.Value + "\n"; 
} 
+0

感謝您的改進;) – abatishchev

1

試試這個

XDocument xDocument = new XDocument(); 
//load xml 
StringBuilder sb = new StringBuilder(); 

foreach(var text in xDocument.Descendants("text")) 
{ 
sb.append(text.value) 
} 
0

的XDocument是你的朋友?

var doc = XDocument.Load(...filename...); 
var strings = doc.Descendants("text").Select(x => x.Value).ToArray(); 
var result = string.Join("\r\n", strings); 

也許甚至有被使用ForEach一個簡單的方法擴展方法...

1

這裏是一個應該證明你可以做一個Win32控制檯例如:

var doc = XDocument.Parse(
    "<containers>" + 
     "<container>"+ 
      "<elt3243> </elt3243>"+ 
      "<elt1122></elt1122>"+ 
      "<elt><text> Put me in a string please </text> </elt>"+ 
      "<elt2211></elt2211>"+ 
     "</container>"+ 
     "<container>"+ 
      "<elt3243><text>I would also like to be in the string</text></elt3243>"+ 
      "<elt1122></elt1122>"+ 
      "<elt> </elt>"+ 
      "<elt2211></elt2211>"+ 
     "</container>"+ 
    "</containers>", LoadOptions.None); 

var text = doc.Descendants("text").Select(x => x.Value); 
Console.WriteLine(string.Join(" \n ", text)); 
Console.ReadKey(false); 

需要注意的是,你並不真的需要這個項目到一個數組或列表,如一些早期的答案表示。 string.Join只是想要一個分隔符和一個對象數組; IEnumerable<string>到數組由處理程序隱式處理。要測試它,請創建一個新的C#控制檯應用程序,並將其放入Main()中。應該原樣...

相關問題