2010-11-13 11 views
33

aşağıdaki yapıyı içeren bir XML belgesine bir dize yükleme ediyorum: o zamanXmlDocument.SelectSingleNode ve xmlNamespace sorunu

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

aşağıdaki sorunu: bütün XmlDocument

<?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> 

sonra im yükleme gerçekleşir: Kök öğesinden xmlns özniteliğini kaldırdığımda (Project)

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

onun iyi çalışması, İlgili elemanı döndürmek için SelectSingleNode'umu nasıl geliştirebilirim?

cevap

66

Sen SelectSingleNode() çağrınızda bir XmlNamespaceManager kullanmalıdır: documentation of SelectSingleNode() on the MSDN sağ Alınan

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

bu SelectNodes' 'uygulanan mi? –

+0

@ T.S., Evet. SelectSingleNode ("xpath") 'kabaca 'SelectNodes (" xpath ") [0]' ile eşdeğerdir. –

+0

'msbld' nereden geldi? –

16

:

Not
XPath ifadesi bir önek içermiyorsa, bu ad alanı URI'sinin boş ad alanı olduğu varsayılır. XML'niz varsayılan bir ad alanı içeriyorsa, XmlNamespaceManager'a bir önek ve ad alanı URI'sı eklemeniz gerekir; aksi halde, seçili bir düğüm alamazsınız. Daha fazla bilgi için bkz. Select Nodes Using XPath Navigation.

Ve hemen aşağıdaki örnek kod

It'snotasifthiswouldbe "hiddenknowledge"

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

olduğunu. ;-)

+0

Son cümle bağlantıları 100 puan! Birden çok ad alanı belirtimiyle ilgili uyarı için – milesma

2

'ItemGroup' birden fazla 'Compile' çocuğa sahip olabileceğinden ve 'Project/ItemGroup' grubundaki 'Compile' çocuklarını özel olarak istemiş olduğunuz için, aşağıdaki tüm 'Compile' çocuklarını döndürecek ve no diğerleri:

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:' ad alanı belirtiminin her düğüm düzeyinden önce gelmesi gerektiğini unutmayın.

+0

belirtilmiştir. – Bora

0

ad alanını belirtmek gerekmez Bu şekilde:

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml("your xml"); 
XmlNode node = xmlDoc.SelectSingleNode("/*[local-name() = 'Compile']"); 
XmlNode nodeToImport = xmlDoc2.ImportNode(node, true); 
xmlDoc2.AppendChild(nodeToImport);