2009-06-01 11 views
35

XDocument'den nasıl bir NameTable alabilirim?XDocument'den nasıl bir NameTable alabilirim?

XmlDocument'in sahip olduğu NameTable özelliğine sahip görünmüyor.

DÜZENLEME: Cevap eksikliğinden yola çıkarak, noktayı kaçırıyor olabileceğimi tahmin ediyorum. Böyle bir XDocument XPath sorguları yapıyorum

...

document.XPathSelectElements("//xx:Name", namespaceManager); 

Düzgün çalışır ama elle ziyade mevcut nametable alınırken daha ben XmlNamespaceManager için kullanmak istediğiniz ad alanlarını eklemek zorunda XDocument sizin gibi bir XmlDocument ile olurdu.

+0

olası bir cevap için verilen linke bir göz atın lütfen .... http://stackoverflow.com/questions/879728/can-i-use-predefined-namespaces-when-loading- Bir xdocument –

cevap

25

XML'i bir XmlReader'dan geçirmeniz ve XmlReader'ın NameTable özelliğini kullanmanız gerekir.

Eğer zaten bir XDocument içine yüklüyorsunuz Xml varsa o zaman XDocument yüklemek için bir XmlReader kullandığınızdan emin olun: - Eğer XDocument ile sıfırdan Xml bina varsa

XmlReader reader = new XmlTextReader(someStream); 
XDocument doc = XDocument.Load(reader); 
XmlNameTable table = reader.NameTable; 

Eğer XDocument en aramanız gerekmektedir CreateReader yöntemi daha sonra okuyucuyu tüketen bir şey var. Okuyucunun kullanılmasından sonra (bir başka XDocument yükleniyor fakat daha iyi bir şey okuyucunun XDocument'in içeriğinden kaçmasına neden olan hiçbir şey yapmaz) AdTable'ı alabilirsiniz.

20

böyle yaptım:

//Get the data into the XDoc 
XDocument doc = XDocument.Parse(data); 
//Grab the reader 
var reader = doc.CreateReader(); 
//Set the root 
var root = doc.Root; 
//Use the reader NameTable 
var namespaceManager = new XmlNamespaceManager(reader.NameTable); 
//Add the GeoRSS NS 
namespaceManager.AddNamespace("georss", "http://www.georss.org/georss"); 
//Do something with it 
Debug.WriteLine(root.XPathSelectElement("//georss:point", namespaceManager).Value); 

Matt

elle ziyade XDocument gibi mevcut nametable alınırken daha ben XmlNamespaceManager için kullanmak istediğiniz ad alanlarını eklemek zorunda
+0

sadece xml metin veya XDocument tek yolu vardı, ancak XmlReader vardı önceki çözüm daha verimli. – dmihailescu

3

Bir XmlDocument ile olurdu.

XDocument project = XDocument.Load(path); 
//Or: XDocument project = XDocument.Parse(xml); 
var nsMgr = new XmlNamespaceManager(new NameTable()); 
//Or: var nsMgr = new XmlNamespaceManager(doc.CreateReader().NameTable); 
nsMgr.AddNamespace("msproj", "http://schemas.microsoft.com/developer/msbuild/2003"); 
var itemGroups = project.XPathSelectElements(@"msproj:Project/msproj:ItemGroup", nsMgr).ToList(); 
İlgili konular