1

我试图在我的程序中解析一些 XML,但我似乎无法找出最好的方法来做到这一点。

XML 有一个称为“容器”的元素。该元素有多个称为“文本”的后代。我想做的是按顺序提取“文本”元素中的值,并将它们保存在字符串中。

所以 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";

这样做的最佳方法是什么?

4

5 回答 5

2
XDocument doc = XDocument.Load(file.FullName);
var strings = doc.Descendants("container").SelectMany(x => x.Descendants("text")).ToList();
return strings.Join(" \n ");
于 2012-10-11T15:01:55.997 回答
1

尝试这个

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

foreach(var text in xDocument.Descendants("text") )
{
sb.append(text.value)
}
于 2012-10-11T15:00:12.880 回答
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()。应该按原样工作...

于 2012-10-11T15:06:14.220 回答
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";
}
于 2012-10-11T14:52:51.913 回答
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 扩展方法......

于 2012-10-11T15:00:32.357 回答