質問

次の構造を含む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"); // return null

XMLNS属性をルート要素(プロジェクト)から削除すると、selectSinglenodeを改善して関連する要素を返すにはどうすればよいですか?

役に立ちましたか?

解決

を使用する必要があります xmlnamespacemanager あなたの電話で selectsinglenode():

XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable);
ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
XmlNode node = xmldoc.SelectSingleNode("//msbld:Compile", ns);

他のヒント

からすぐに取られます のドキュメント SelectSingleNode() MSDNで:

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

そして、次のサンプルコードは次のとおりです

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

これは いいえ なので もしも これ します なれ "隠れた 知識". ;-)

「itemgroup」には複数の「コンパイル」の子供がいる可能性があるため、「プロジェクト/アイテムグループ」の「コンパイル」の子供を具体的に望んでいるため、以下はすべての希望の「コンパイル」子供を返します。

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:' namespace仕様は、各ノードレベルに先行する必要があることに注意してください。

これにより、名前空間を指定する必要はありません。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("your xml");
XmlNode node = xmlDoc.SelectSingleNode("/*[local-name() = 'Compile']");
XmlNode nodeToImport = xmlDoc2.ImportNode(node, true);
xmlDoc2.AppendChild(nodeToImport);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top