Linq to XML: Extraire des elements par nom et attribut
Hello ! Me revoila avec encore plus de problemes XML :-)
J'ai le fichier XML suivant que je dois parser pour en extraire des parametres:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| <?xml version="1.0" encoding="UTF-8"?>
<bulkCmConfigDataFile xmlns:un="utranNrm.xsd" xmlns:xn="genericNrm.xsd" xmlns:gn="geranNrm.xsd" xmlns="configData.xsd"
xmlns:es="Vendor1SpecificAttributes.1.0.xsd">
<fileHeader fileFormatVersion="1.0" vendorName="Vendor1"/>
<configData dnPrefix="Undefined">
<xn:SubNetwork id="ONRM_ROOT_MO_R">
<xn:SubNetwork id="RNC0001">
<xn:MeContext id="BLABLA">
[...]
</xn:MeContext>
<xn:MeContext id="MACHIN">
[...]
</xn:MeContext>
<xn:MeContext id="RNC0001">
<xn:VsDataContainer id="RNC0001">
</xn:VsDataContainer>
<xn:ManagedElement id="1">
<un:RncFunction id="1">
<un:UtranCell id="111111A">
<un:attributes>
<un:uarfcnUl>9800</un:uarfcnUl>
<un:uarfcnDl>10700</un:uarfcnDl>
</un:attributes>
<xn:VsDataContainer id="111111A">
<es:Position>
<es:latitudeSign>1</es:latitudeSign>
<es:latitude>3070727</es:latitude>
<es:longitude>8786820</es:longitude>
</es:Position>
</xn:VsDataContainer>
<xn:VsDataContainer id="1">
</xn:VsDataContainer>
</un:UtranCell>
<un:UtranCell id="111111B">
<un:attributes>
<un:uarfcnUl>9800</un:uarfcnUl>
<un:uarfcnDl>10700</un:uarfcnDl>
</un:attributes>
<xn:VsDataContainer id="111111B">
<es:Position>
<es:latitudeSign>1</es:latitudeSign>
<es:latitude>3070555</es:latitude>
<es:longitude>8786666</es:longitude>
</es:Position>
</xn:VsDataContainer>
<xn:VsDataContainer id="1">
</xn:VsDataContainer>
</un:UtranCell>
</un:RncFunction>
</xn:ManagedElement>
</xn:MeContext>
</xn:SubNetwork>
</xn:SubNetwork>
</configData>
<fileFooter dateTime="2011-11-28T08:38:45Z"/>
</bulkCmConfigDataFile> |
Jusqu'a maintenant je n'arrive qu'a extraire le premier element par nom pour un espace de nom donne:
Code:
1 2 3
| XNamespace xn = "genericNrm.xsd";
XNamespace un = "utranNrm.xsd";
var test1 = xmldoc.Descendants(xn + "MeContext").FirstOrDefault(); |
Ce qui me retourne le premier Element "MeContext" (dans ce cas le MeContext avec id=BLABLA)
Si j'essaye:
Code:
1 2 3
| XNamespace xn = "genericNrm.xsd";
XNamespace un = "utranNrm.xsd";
var test1 = xmldoc.Descendants(xn + "MeContext"); |
Ce qui d'apres moi devrait me donner une collection des Element au niveau inferieur, test1 = null ...
1 - Ma premiere question est la suivante: comment extraire un element ayant un attribut donne (et lui seul). Dans mon cas je cherche a extraire le MeContext ayant l'id = RNC0001 et aucun autre. J'ai essaye le code ci-dessous mais ca ne me retourne que des valeurs null.
Code:
1 2 3 4 5
| XNamespace xn = "genericNrm.xsd";
IEnumerable<XElement> utrancells =
xmldoc.Root
.Elements(xn + "MeContext")
.Where(el => (string)el.Attribute("id") == "RNC0001"); |
2 - Mon second probleme est d'extraire une collection d'elements contenus dans <xn:MeContext id="RNC0001"></xn:MeContext>
Je voudrais avoir tout les <un:UtranCell id="XXXXX"></un:UtranCell> (leur contenu) dans une collection afin de pouvoir extraire des donnees depuis chacune (chaque element UtranCell represente une entite differente). Par exemple je veux extraire la latitude et la longitude:
Code:
1 2
| <es:latitude>3070555</es:latitude>
<es:longitude>8786666</es:longitude> |
depuis chaque <un:UtranCell id="XXXXX"></un:UtranCell>
Dans cette optique j'ai teste:
Code:
1 2 3
| XNamespace un = "utranNrm.xsd";
var test3 = xmldoc.Elements(un + "UtranCell");
var test4 = test1.Elements(un + "UtranCell"); |
et encore une fois cela ne me retourne que des valeurs nulles.
Merci d'avance !
Edit: ajout d'un exemple apres le XML sans .FirstOrDefault()