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

本文关键字:获取 文本 节点 xml linq xpath 使用 | 更新日期: 2023-09-27 18:08:44

我试图从任何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与"//text()",但这并没有得到CDATA节点内的文本。

UPDATE

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

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

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

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

您可以使用LINQ到XML和

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

使用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>
使用<<p> (em> Xamarin的, Mac OS 10.9