どのようにして、文書内の未知のXML名前空間を見つけることができますか?
-
21-08-2019 - |
質問
具体的に(深呼吸を取る):どのようにC#の/内のすべてのXML名前空間を見つけるに行くか該当するスキーマは、インスタンスのXmlDocument
(XmlSchemaSet
プロパティ)ではありませんそのためNET Schemas
私のXPath魔法はこのような何かを洗練を欠いているが、私はその間に探し続けるだろう...
解決
あなたは、ドキュメント内のすべての個別の名前空間の一覧を取得して、スキーマセット内の個別の名前空間とそれを比較する必要があります。
しかし、名前空間宣言名は、通常のXPathドキュメントモデルで公開されていません。しかし、ノード与えられたあなたは、その名前空間を取得することができます:
// Match every element and attribute in the document
var allNodes = xmlDoc.SelectNodes("//(*|@*)");
var found = new Dictionary<String, bool>(); // Want a Set<string> really
foreach (XmlNode n in allNodes) {
found[n.NamespaceURI] = true;
}
var allNamespaces = found.Keys.OrderBy(s => s);
他のヒント
私が今までに与えられたXmlDocumentから名前空間のすべてを取得するために見つけた最も簡単な方法は、固有の接頭辞とNamespaceURIを値を求めるすべてのノードを介してのXPathにある。
私は、私は複雑なXML文書を扱うてるときの生活をより簡単にしてXmlNamespaceManagerにこれらのユニークな値を返すために使用するヘルパールーチンを持っています。
次のようにコードは
private static XmlNamespaceManager PrepopulateNamespaces( XmlDocument document )
{
XmlNamespaceManager result = new XmlNamespaceManager( document.NameTable );
var namespaces = ( from XmlNode n in document.SelectNodes( "//*|@*" )
where n.NamespaceURI != string.Empty
select new
{
Prefix = n.Prefix,
Namespace = n.NamespaceURI
} ).Distinct();
foreach ( var item in namespaces )
result.AddNamespace( item.Prefix, item.Namespace );
return result;
}
所属していません StackOverflow