Question

Plus précisément (en prenant une grande respiration). Comment feriez-vous de trouver tous les espaces de noms XML dans un C # / NET pour lesquels il XmlDocument n'y a pas de schémas applicables dans XmlSchemaSet (propriété Schemas) de l'instance ?

Ma magie XPath manque la sophistication de faire quelque chose comme ça, mais je vais continuer à chercher dans l'intervalle ...

Était-ce utile?

La solution

Vous devez obtenir une liste de tous les espaces de noms distincts dans le document, puis comparer cela avec les espaces de noms distincts dans l'ensemble du schéma.

Mais les noms de déclaration d'espace de noms ne sont généralement pas exposés dans le modèle de document XPath. Mais étant donné un nœud que vous pouvez obtenir son espace de noms:

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

Autres conseils

La façon la plus simple que j'ai jamais trouvé de récupérer tous les espaces de noms d'un XmlDocument donné est à XPath par tous les nœuds de trouver des valeurs uniques et Prefix NamespaceURI.

J'ai une routine d'aide que j'utiliser pour renvoyer ces valeurs uniques dans un XmlNamespaceManager pour rendre la vie plus simple quand je traite des documents Xml complexes.

Le code est le suivant:

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top