2009-06-01 9 views
35

XDocumentからどのようにNameTableを取得できますか?XDocumentからどのようにNameTableを取得できますか?

XmlDocumentにはNameTableプロパティがないようです。

編集:答えの欠如で判断すると、私はポイントを見逃しているかもしれないと推測しています。私はこのようなXDocumentに対してXPathクエリを行っています

...

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

それが正常に動作しますが、私は手動ではなくから既存の名前テーブルを取得するよりも、私がてXmlNamespaceManagerに使用する名前空間を追加する必要がありますXDocumentはXmlDocumentと同じです。

+0

可能な答えのために与えられたリンクをご覧ください.... http://stackoverflow.com/questions/879728/can-i-use-predefined-namespaces-when-loading- an-xdocument –

答えて

25

XmlReaderを使用してXMLをshoveし、XmlReaderのNameTableプロパティを使用する必要があります。

あなたはすでにあなたがXDocumentにロードされているXMLを持っているなら、あなたはXDocumentをロードするためのXmlReaderを使用してください: - あなたはXDocumentと最初からXMLを構築している場合

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

あなたはXDocumentのを呼び出す必要がありますCreateReaderメソッドは、何かを読んで消費します。一度リーダーを使用すると(別のXDocumentを読み込んでいても、リーダーがXDocumentの内容を実行するだけのシンクはありません)、NameTableを取得できます。

20

私はこのようにそれをやった:私は手動で私が てXmlNamespaceManagerに使用する名前空間を追加する必要がなく、XDocumentのような から既存の名前テーブルを取得

//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); 

マット

+0

唯一の方法であるxmlテキストまたはXDocumentがある場合は、XmlReaderを使用した場合は以前のソリューションより効率的です。 – dmihailescu

3

XmlDocumentを使用します。

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(); 
関連する問題