2010-05-01 7 views
0

Je suis toujours très content d'avoir une chance d'utiliser linq pour xml et ensuite je rencontre le même problème PITA avec les espaces de noms. Je ne sais pas ce qui ne va pas chez moi, mais je ne peux jamais vraiment comprendre ce qui se passe. Fondamentalement, j'ai juste besoin pour obtenir la valeur de l'élément responseCode et jusqu'à présent je n'ai pas eu la chance :(linq en xml et namespaces

<?xml version="1.0" encoding="IBM437"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
    <ns1:ActionResponse xmlns:ns1="http://cbsv.ssa.gov/ws/datatype"> 
    <ns1:responseCode>0000</ns1:responseCode> 
    <ns1:responseDescription>Successful</ns1:responseDescription> 
    </ns1:ActionResponse> 
</soapenv:Body> 
</soapenv:Envelope> 

Répondre

2

espaces de nommage dans LINQ to XML sont vraiment traités avec élégance, OMI Voici un exemple:.

XNamespace ns1 = "http://cbsv.ssa.gov/ws/datatype"; 
XDocument doc = XDocument.Load(...); 
string code = doc.Descendants(ns1 + "responseCode") 
       .Select(x => (string) x) 
       .First(); 

Si vous voulez travailler en partant du haut, en utilisant les deux espaces de noms impliqués, c'est bien aussi:

XNamespace ns1 = "http://cbsv.ssa.gov/ws/datatype"; 
XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/"; 
XDocument doc = XDocument.Load(...); 
string code = (string) doc.RootElement 
          .Element(soapenv + "Body") 
          .Element(ns1 + "ActionResponse") 
          .Element(ns1 + "responseCode"); 

pour être clair, il n'y a rien forcer vous d'utiliser le même nom de variable que le préfixe d'espace de noms dans le XML - Je viens de le faire pour plus de clarté.

0

Avec XML comme ceci:

<esri:DataElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:esri="http://www.esri.com/schemas/ArcGIS/10.0" xsi:type="esri:DEFeatureClass"> 
    <CatalogPath>\counties</CatalogPath> 
    <Name>counties</Name> 

… 

</esri:DataElement> 

j'utilisais des requêtes comme:

tableInfo.TableName = (from element in xDoc.Descendants("Name") 
                select Convert.ToString(element.Value)).FirstOrDefault(); 

Mais si vous définissez l'espace de noms dans votre code, vous pouvez être plus précis, plus rapide:

XNamespace esri = "http://www.esri.com/schemas/ArcGIS/10.0"; 

tableInfo.TableName = xDoc.Element(esri + "DataElement").Element("Name").Value; 

Vous pouvez penser à déclarer que l'espace de noms prend la place de "esri:" dans les chaînes. (Il n'y a aucun moyen d'utiliser un deux-points dans une requête non plus). De plus, dans un fichier comme celui-ci, je trouvais plusieurs occurrences de balises, donc il est important d'obtenir les bonnes (ou au moins un seul jeu). Avant, je me retrouvais avec des informations redondantes pour les champs, ce qui gâcherait la création d'une table SQL Server. Maintenant, je peux définir quel élément je veux lié à la racine du document.