在C#中读取复杂的xml

时间:2011-07-12 11:40:20

标签: xml windows-phone-7 linq-to-xml

我正在尝试读取xml文件,文件格式如下:

<rootnode>
<a>first<b>1st</b></a>
<a>second<b>2nd</b></a>
</rootnode>

我试图像这样使用XDocument:

XDocument loadedData = XDocument.Load("file.xml");
        var data = from query in loadedData.Descendants("a")
                   select new myClass
                   {
                       Word = (string)query.Value,
                       secondWord = (string) query.Element("b")
                   };

但它没有用,因为(字符串)query.Value会给我带来整行;“首先第一

有没有办法获取文本而不是整个元素?

2 个答案:

答案 0 :(得分:1)

我真的无法对在XML中处理此问题的“正确”方法进行大量探索,但是如果对结果进行了一些字符串操作呢?

 var data = from query in loadedData.Descendants("a")
     select new myClass
     {
         Word = (string)query.Value.Substring(0, ((string)query.Value).Length - ((string)query.Element("b").Value).Length),
         secondWord = (string)query.Element("b")
     };

丑陋,但它确实有效。我确信有一种“更好”的方式,但正如我所说,我目前没有足够的带宽来调查它。

修改

正如我在对原始问题的评论中提到的,如果您首先控制编写XML,那么最好重新格式化它 - 可能就像这样。

<rootnode>
  <item><a>first</a><b>1st</b></item>
  <item><a>second</a><b>2nd</b></item>
</rootnode>

这不仅可以让您整理代码以获得干净的值,还可以根据需要灵活地在每个元素中添加更多数据项。 e.g。

<rootnode>
  <item><a>first</a><b>1st</b><c>primary</c></item>
  <item><a>second</a><b>2nd</b><c>secondary</c></item>
</rootnode>

答案 1 :(得分:0)

你需要将你的后代改为“rootnode”而不是“a”。试试这个:

XDocument loadedData = XDocument.Load("file.xml");
var data = (from query in loadedData.Descendants("rootnode")
    select new myClass
    {
        Word  = (string)query.Element("a"),
        secondWord  = ((string)query.Element("b"))
    });