どのようにして、文書内の未知のXML名前空間を見つけることができますか?

StackOverflow https://stackoverflow.com/questions/509967

質問

具体的に(深呼吸を取る):どのようにC#の/内のすべてのXML名前空間を見つけるに行くか該当するスキーマは、インスタンスのXmlDocumentXmlSchemaSetプロパティ)ではありませんそのため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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top