Frage

Im Einzelnen (und holt tief Luft.): Wie würden Sie all XML-Namespaces in einem C # gehen über die Suche nach / NET XmlDocument für die es keine anwendbaren Schemata in der Instanz XmlSchemaSet (Schemas Eigenschaft)

?

Meine XPath Magie ist die Raffinesse fehlt, so etwas zu tun, aber ich werde in der Zwischenzeit immer auf der Suche ...

War es hilfreich?

Lösung

Sie müssen eine Liste aller verschiedenen Namensräume in dem Dokument zu erhalten, und dann vergleichen Sie das mit den verschiedenen Namensräumen im Schema gesetzt.

Aber Namespace-Deklaration Namen werden in der Regel nicht in dem XPath-Dokumentenmodell ausgesetzt. Aber da ein Knoten können Sie seinen Namensraum erhalten:

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

Andere Tipps

Der einfachste Weg, den ich je gefunden habe alle der Namensräume von einem gegebenen XmlDocument abzurufen ist zu XPath durch alle Knoten zu finden, einzigartigen Präfix und NamespaceURI Werte.

Ich habe eine Helfer-Routine, die ich verwende, um diese eindeutigen Werte in einem XmlNamespaceManager zurückzukehren Leben einfacher zu machen, wenn ich mit komplexen XML-Dokumenten zu tun habe.

Der Code lautet wie folgt:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top