使用linq或xpath获取xml中的所有文本节点

时间:2014-06-13 17:23:19

标签: c# xml linq xpath

我试图从任何XML获取所有文本节点。所以我需要代码有点动态。

以下是我需要处理的许多不同XML中的两个。

<questionset>

<!-- 1 -->
      <question id="1" returnOnIncorrect="false" vo="" img="">
         <![CDATA[
            ddddddddd?
         ]]>
    <!-- a -->
      <answer id="1" correct="0">
        <input>
          <![CDATA[
              eeeeeeeeee
          ]]>
        </input>
        <output>
          <![CDATA[
              iiiiiiiii.
          ]]>
        </output>
      </answer>
     </question>
</questionset>

其他XML

<xml>
  <content>
    <layout layoutId="0" copyFromId="0">
      <text indent="1" containerId="0">aaaaaaaa</text>
      <sound src="assets/SND_29c.mp3" />
      <img src="assets/IMG_29c.jpg" />
      <text indent="1" containerId="0">bbbbbbb</text>
      <sound src="assets/SND_29d.mp3" />
      <text indent="1" containerId="0">cccccccc</text>
    </layout>
  </content>
</xml>

我想知道是否可以使用XPath或Linq获取所有文本节点。

尝试过使用XPath&#34; // text()&#34;但这不会得到CDATA节点内的文本。

更新 PreserveWhitespace为真

然后我使用以下查询尝试使用Linq,但没有运气:

var xxml = XElement.Load(this.m_folder + "\\" + item.DisplayName);                
var query =
           from e in xxml.Descendants()
           where e.NodeType==XmlNodeType.CDATA
           select e; 

有人知道如何解决这个问题吗?任何回复都将不胜感激。

2 个答案:

答案 0 :(得分:5)

您可以使用LINQ to XML和

XDocument doc = XDocument.Load("file.xml");
IEnumerable<XText> textNodes = doc.DescendantNodes().OfType<XText>();

答案 1 :(得分:0)

使用XPath //text()。我将两个XML放在一个文件中只是为了测试它:

string xmlString = 
    "<questionset>\n" +
    "  <!-- 1 -->\n" +
    "  <question id=\"1\" returnOnIncorrect=\"false\" vo=\"\" img=\"\">\n" +
    "    <![CDATA[\n" +
    "      ddddddddd?\n" +
    "    ]]>\n" +
    "    <!-- a -->\n" +
    "    <answer id=\"1\" correct=\"0\">\n" +
    "      <input>\n" +
    "        <![CDATA[\n" +
    "          eeeeeeeeee\n" +
    "        ]]>\n" +
    "      </input>\n" +
    "      <output>\n" +
    "        <![CDATA[\n" +
    "          iiiiiiiii.\n" +
    "        ]]>\n" +
    "      </output>\n" +
    "    </answer>\n" +
    "  </question>\n" +
    "  <content>\n" +
    "    <layout layoutId=\"0\" copyFromId=\"0\">\n" +
    "      <text indent=\"1\" containerId=\"0\">aaaaaaaa</text>\n" +
    "      <sound src=\"assets/SND_29c.mp3\" />\n" +
    "      <img src=\"assets/IMG_29c.jpg\" />\n" +
    "      <text indent=\"1\" containerId=\"0\">bbbbbbb</text>\n" +
    "      <sound src=\"assets/SND_29d.mp3\" />\n" +
    "      <text indent=\"1\" containerId=\"0\">cccccccc</text>\n" +
    "    </layout>\n" +
    "  </content>\n" +
    "</questionset>";

var doc = new XmlDocument();
doc.LoadXml(xmlString);

var nodes = doc.SelectNodes("//text()");

foreach (XmlNode childrenNode in nodes) {
    Console.WriteLine("<text>" + childrenNode.SelectSingleNode(".").Value.Trim() + "</text>");
} 

打印:

<text>ddddddddd?</text>
<text>eeeeeeeeee</text>
<text>iiiiiiiii.</text>
<text>aaaaaaaa</text>
<text>bbbbbbb</text>
<text>cccccccc</text>

(在 Mac OS 10.9上使用 Xamarin

相关问题