我试图从任何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;
有人知道如何解决这个问题吗?任何回复都将不胜感激。
答案 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 )