2017-02-28 1 views
0

J'ai le document XML suivant avec lequel travailler.Trouver la valeur d'un élément XML en C# lorsqu'un attribut est attaché à cet élément

<ns0:ProductQuantity> 
    <ns0:Measurement> 
     <ns0:MeasurementValue>8500</ns0:MeasurementValue> 
     <ns0:UnitOfMeasureCode Domain="UN-Rec-20">KG</ns0:UnitOfMeasureCode> 
    </ns0:Measurement> 
</ns0:ProductQuantity> 

Je n'ai pas encore été incapable de comprendre comment lire la valeur de « KG » de ce document dans une chaîne dans mon code C#. J'ai extrait d'autres valeurs d'élément, mais aucun d'entre eux n'a cet attribut de Domain="UN-Rec->20" attaché à eux. J'utilise Visual Studio 2013 et une idée de la façon dont j'extrais actuellement d'autres données est la suivante.

XmlDocument doc = new XmlDocument(); 
doc.Load(filePath);    
root = doc.DocumentElement; 
prodAmt_xml[1] = root.GetElementsByTagName("ns0:MeasurementValue")[0].InnerText; 

Si quelqu'un a des problèmes dans ce incitent et un moyen d'obtenir ces « unités de mesure » Je serais très reconnaissant.

Répondre

1

Vous devez prendre en compte l'espace de noms XML. ns0 ne fait pas vraiment partie du nom de l'élément, c'est un préfixe qui correspond à un espace de noms (généralement une URL).

LINQ pour XML et C# 6, en supposant que l'URL est ns0http://foo.bar/:

var doc = XDocument.Load(filePath); 
var ns = XNamespace.Get("http://foo.bar/"); 
var unit = 
    doc.Descendants(ns + "ProductQuantity") 
     .Elements(ns + "Measurement") 
      .Elements(ns + "UnitOfMeasureCode") 
      .Where(e => e.Attribute("Domain")?.Value == "UN-Rec->20") 
      .Select(e => e.Value) 
      .FirstOrDefault(); 

Notez que ?. nécessite C# 6; Si vous utilisez une version antérieure, vous pouvez également le faire:

var doc = XDocument.Load(filePath); 
var ns = XNamespace.Get("http://foo.bar/"); 
var unit = 
    (from e doc.Descendants(ns + "ProductQuantity") 
       .Elements(ns + "Measurement") 
       .Elements(ns + "UnitOfMeasureCode") 
    let attr = e.Attribute("Domain") 
    let domain = attr != null ? attr.Value : null 
    where domain == "UN-Rec->20" 
    select e.Value).FirstOrDefault(); 
+0

Je n'ai pas certaines de ces commandes à utiliser malgré l'utilisation d'une référence de bibliothèque 'LINQ' et 'XML'. N'y a-t-il aucun moyen de traiter le "ns0: UnitOfMeasureCode" comme un nom d'élément et d'ignorer l'attribut et l'espace de noms attachés? J'ai vu une référence au format '.GetElementsByTagName ("ns0: UnitOfMeasureCode", [@ Domain = "UN-Rec-20"])' mais je dois encore le faire fonctionner correctement. Je crois que j'utilise C# 5.0 avec .Net 4.5 si cela aide. – MBrockley

+0

@MBrockley vous avez besoin d'une référence à 'System.Xml.Linq.dll'. La seule fonctionnalité C# 6 que j'utilise ici est '? .'. Je vais envoyer une version du code qui n'en a pas besoin. –

+0

"N'y a-t-il aucun moyen de traiter le" ns0: UnitOfMeasureCode "comme un nom d'élément et d'ignorer l'attribut et l'espace de noms associés?" Non, ce n'est pas comme ça que le XML fonctionne ... –