具体的には(深呼吸):インスタンスの(プロパティ)XmlDocument
に適用可能なスキーマがないC#/。NET内のすべてのXML名前空間をどのように見つけますか?XmlSchemaSet
Schemas
私のXPathマジックは、このようなことを行うための高度な機能を欠いていますが、それまでの間、探し続けます...
具体的には(深呼吸):インスタンスの(プロパティ)XmlDocument
に適用可能なスキーマがないC#/。NET内のすべてのXML名前空間をどのように見つけますか?XmlSchemaSet
Schemas
私のXPathマジックは、このようなことを行うための高度な機能を欠いていますが、それまでの間、探し続けます...
特定の XmlDocument からすべての名前空間を取得するためにこれまでに見つけた最も簡単な方法は、一意の Prefix 値と 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;
}
ドキュメント内のすべての個別の名前空間のリストを取得し、それをスキーマ セット内の個別の名前空間と比較する必要があります。
ただし、名前空間宣言名は通常、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);