【问题标题】:Reading complex xml in C#在 C# 中读取复杂的 xml
【发布时间】:2011-07-12 11:40:20
【问题描述】:

我正在尝试读取一个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 会给我带来整行;“first1st

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

【问题讨论】:

  • 如果您对 xml 有任何控制,我会认真建议将其重构为更易于维护的东西,例如。 &lt;item&gt;&lt;a&gt;first&lt;/a&gt;&lt;b&gt;1st&lt;/b&gt;&lt;/item&gt;。如果你能做到这一点,你的代码就会变得更简洁,并且在以后需要添加 &lt;c&gt; 元素时不太可能中断。

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


【解决方案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>

这不仅使您能够整理代码以获得干净的值,而且如果需要,还可以灵活地在每个元素内添加更多数据项。例如

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

【讨论】:

    【解决方案2】:

    您需要将后代更改为来自“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"))
        });
    

    【讨论】:

      猜你喜欢
      • 2016-08-16
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多