53

次の構造を含む XML ドキュメントに文字列を読み込んでいます。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">                  
  <ItemGroup>
    <Compile Include="clsWorker.cs" />        
  </ItemGroup>      
</Project>

次に、すべてをにロードしていXmlDocumentます:

XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(Xml);

次に、次の問題が発生します。

XmlNode Node = xmldoc.SelectSingleNode("//Compile"); // returns null

xmlnsルート要素 ( ) から属性を削除すると、Project正常に動作します。

SelectSingleNode関連する要素を返すにはどうすればよいですか?

4

4 に答える 4

97

SelectSingleNode()への呼び出しでXmlNamespaceManagerを使用する必要があります。

XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable);
ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
XmlNode node = xmldoc.SelectSingleNode("//msbld:Compile", ns);
于 2010-11-13T07:32:06.813 に答える
24

MSDNのドキュメントSelectSingleNode()から引用:


XPath 式にプレフィックスが含まれていない場合、名前空間 URI は空の名前空間であると見なされます。XML に既定の名前空間が含まれている場合でも、プレフィックスと名前空間 URI を XmlNamespaceManager に追加する必要があります。そうしないと、ノードが選択されません。詳細については、「XPath ナビゲーションを使用してノードを選択する」を参照してください。

そして直後のサンプルコードは

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ab", "http://www.lucernepublishing.com");
XmlNode book = doc.SelectSingleNode("//ab:book", nsmgr);

これ 隠された知識」であると限りませ 。;-)

于 2010-11-13T07:32:12.613 に答える
3

'ItemGroup' には複数の 'Compile' 子が含まれる可能性があり、具体的には 'Project/ItemGroup' の 'Compile' 子が必要なため、次のコマンドは目的の 'Compile' 子をすべて返しますが、それ以外は返しません。

XmlDocument projectDoc = new XmlDocument();
projectDoc.Load(projectDocPath);
XmlNamespaceManager ns = new XmlNamespaceManager(projectDoc.NameTable);
ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
XmlNodeList xnList = projectDoc.SelectNodes(@"/msbld:Project/msbld:ItemGroup/msbld:Compile", ns);

「msbld:」名前空間の指定は、各ノード レベルの前に置く必要があることに注意してください。

于 2016-06-14T15:37:36.600 に答える