/Obj/Name/text()
はCDATAマークアップのコンテンツを返すためのXPathです。
私を捨てたのは、Valueプロパティの動作でした。 XMLNode(DOMワールド)の場合、Element(CDATAまたはそれ以外の場合)のXmlNode.ValueプロパティはNullを返します。 InnerTextプロパティはCDATA/Textコンテンツを提供します。 Xml.Linqを使用する場合、XElement.ValueはCDATAコンテンツを返します。
string sXml = @"
<object>
<name><![CDATA[SomeText]]></name>
<name>OtherName</name>
</object>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(sXml);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmlDoc.NameTable);
Console.WriteLine(@"XPath = /object/name");
WriteNodesToConsole(xmlDoc.SelectNodes("/object/name", nsMgr));
Console.WriteLine(@"XPath = /object/name/text()");
WriteNodesToConsole(xmlDoc.SelectNodes("/object/name/text()", nsMgr));
Console.WriteLine(@"Xml.Linq = obRoot.Elements(""name"")");
XElement obRoot = XElement.Parse(sXml);
WriteNodesToConsole(obRoot.Elements("name"));
出力:
XPath = /object/name
NodeType = Element
Value = <null>
OuterXml = <name><![CDATA[SomeText]]></name>
InnerXml = <![CDATA[SomeText]]>
InnerText = SomeText
NodeType = Element
Value = <null>
OuterXml = <name>OtherName</name>
InnerXml = OtherName
InnerText = OtherName
XPath = /object/name/text()
NodeType = CDATA
Value = SomeText
OuterXml = <![CDATA[SomeText]]>
InnerXml =
InnerText = SomeText
NodeType = Text
Value = OtherName
OuterXml = OtherName
InnerXml =
InnerText = OtherName
Xml.Linq = obRoot.Elements("name")
Value = SomeText
Value = OtherName
XMLNodeののCDATAタイプのためのTODOを持っていたビジュアルのXPathの作者が判明。少しコードスニペットと私は今CDATAサポートを持っています。
メインフォーム。cs
private void Xml2Tree(TreeNode tNode, XmlNode xNode)
{
...
case XmlNodeType.CDATA:
//MessageBox.Show("TODO: XmlNodeType.CDATA");
// Gishu
TreeNode cdataNode = new TreeNode("![CDATA[" + xNode.Value + "]]");
cdataNode.ForeColor = Color.Blue;
cdataNode.NodeFont = new Font("Tahoma", 12);
tNode.Nodes.Add(cdataNode);
//Gishu
break;
をそれは基本的にスキャンされたXMLNodeの種類の巨大DisplayNode()スイッチケースを持っていました。.. 。特定のケースブロックでTODOを使用しています。その中にツールがあります。 – Gishu