[C#] - XPath - Ahhhh ma tête

Bonjour cher geeks, [oui je suis de bone humeur ce matin]

  • Voilà je veux parcourir un fichier XML à l’aide XPath en C#. Mais je suis largué.
    voici  le bout de code : String requete = “//*”;

XmlNodeList NodeCollection;
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath(“test.xml”));
XmlElement root = doc.DocumentElement;
NodeCollection = root.SelectNodes(requete);

foreach (XmlNode n in NodeCollection)
{
 lblTest.Text += n.Name.ToString()+
";
}
et donc seule cette requête fonctionne !
si je tente un

String requete = “/rootElement/childElement/”;

ou les variantes sans les slash au début, çà ne m’affiche rien.

Avouez c’est tout de même confusant ?

Et si tu tentes un //rootElement/nodeChild (avec 2 slashs au début) ?
Sinon, c’est quoi ton XML ?

çà ne marche pas non plus. Par contre c’est

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet href="test.css" type="text/css"?>

qui fout la merde…
quand je les enlève çà fonctionne nickel…

Bah fais comme moi, vire tous les DOCTYPE ça sert à rien

Héhé, c’est bourrin çà

  • Il doit quand même y avoir une solution pour aller directement root… d’ailleurs c’est bizarre que ce soit considéré comme un node…

Il considère pas ca comme un node, mais il doit essayer de valider le document avec le DTD (ou le xsd) , et il doit pas pouvoir le faire pour une raison quelconque. Désactive la validation du doc, ou, comme dit plus haut, vire la déclaration.[/quote]

Heu… on fait comment pour désactiver la validation :blush: ??

Rhôô! Virer les DTD et les schémas? Juste pour contourner un truc qu’on sait pas? Saimal.
Les schémas, saibon, mangézan.
Mais effectivement, ça rend les requêtes un peu plus pénibles, puisqu’il faut ajouter un gestionnaire de namespace et bien qualifier ses xpath avec les namespaces correspondants.
Tous les détails ici:
http://msdn.microsoft.com/library/default…pedPrefixes.asp

Oserais-je aussi suggérer l’usage d’un XPathDocument, beaucoup plus efficace qu’un XmlDocument (mais un chouïa plus galère à utiliser quand même, faut pas se mentir)?

Ok, Merci pour l’article Boudin.

Tu peux tout oser, je suis entrain de tâter le terrain en ce qui concerne la manipulation de fichier XML. En tout cas il y a une foultitude de possibilités pour manipuler ces 3 petites lettres…

Je teste et feedback…

Par contre les DTD sont considérées comme des Namespaces ?

Ce message a été édité par EzecKiel le 29/07/2004

Non, çà ne fonctionne toujours pas. Et c’est vrai que dans tous les exemples que j’ai vu personne ne s’emmerde prend le soin de mettre le <?xml … et la DTD…

Damned, t’as raison, tu n’as effectivement pas de schéma mais une saleté de DTD.
Les DTD sont archaïques. Die DTD, die! Schemas rulez!

  • OK, donc je sais ce qu’il me reste à faire. BodySplash, c’est toi qui avait raison - pouillage de DTD.

Comme quoi, on s’obstine à vouloir bien faire les choses et puis au final…

“Ah bat les DTD, vive les schemas” /me s’et converti au Boudinsme

heu… la sortie siouplé ?
Ce message a été édité par EzecKiel le 30/07/2004

  • Bien pratique XPathDocument. D’ailleurs curieusement, çà me semble plus rapide que ce que j’avais fait avant…

  • Cependant, je cherche à copier directement une portion de XML. dans un autre fichier XML

XPathDocument doc = new XPathDocument(Server.MapPath(“festi.xml”));
XPathNavigator nav = doc.CreateNavigator();
XPathExpression Expr = nav.Compile("/rooy//g[@id=’"+ Request.QueryString[“ID”]+"’]//ancestor-or-self::*");

Et là comment faire ? faut-il créer un XPathNodeIterator et boucler dessus ?
Je pense qu’il doit y’avoir plus simple non ?

[quote]- Bien pratique XPathDocument. D’ailleurs curieusement, çà me semble plus rapide que ce que j’avais fait avant…

  • Cependant, je cherche à copier directement une portion de XML. dans un autre fichier XML

XPathDocument doc = new XPathDocument(Server.MapPath(“festi.xml”));
XPathNavigator nav = doc.CreateNavigator();
XPathExpression Expr = nav.Compile("/rooy//g[@id=’"+ Request.QueryString[“ID”]+"’]//ancestor-or-self::*");

Et là comment faire ? faut-il créer un XPathNodeIterator et boucler dessus ?
Je pense qu’il doit y’avoir plus simple non ?[/quote]- Ben tu parles que c’est plus rapide! C’est même fait pour ça. Le document prend aussi considérablement moins de place, est fortement typé en interne, etc.

  • Non, je crois pas que tu puisses vraiment faire plus simple, vu que la structure interne du xpathdocument n’est pas le texte xml. Donc dans ce cas-là, passer par un XmlReader peut être plus simple. Whidbey permettra de passer de l’un à l’autre plus facilement…

Bon j’avoue être un peu paumé là .
Donc je rappelle ce que je veux faire. Dans un fichier XML, prenons çà comme exemple :

<?xml version="1.0" encoding="iso-8859-1"?>    

 
 <Element id=“elt_2” type=“4” />
 

 


 

Donc je souhaite, en fonction de certains paramètres, sélectionner soit le noeud ou l’autre noeud ou les 2 noeuds. A chaque fois que je veux sélectionner un noeud, je veux également prendre ses attributs ainsi que tous ses descendants.

Une fois sélectionnés, je veux les mettre dans un autre fichier XML. Et je voudrai aussi pouvoir copier le noeud avec seulement l’enfant dont la balise est poufpouf et l’identifiant égal à “pf_1”, dans le fichier XML. je veux avoir au final un fichier XML ressemblant à :

<?xml version="1.0" encoding="iso-8859-1"?>    

 

 

Donc j'abandonne le XPath document, et je passe par un XmlTextReader ??

Pour un truc aussi simple que ça, oui, deux solutions viennent à l’esprit:

  • Le XmlReader + XmlWriter, un peu rigide mais top rapide
  • XSLT

Ok. Dommage, XPath avait l’air puissant et pratique

Whidbey permettra de passer de l’un à l’autre plus facilement…

Vivement Whidbey !

Allez j’y retourne

Merci de m’avoir éclairé sur le sujet Boudin
Ce message a été édité par EzecKiel le 03/08/2004

Du coup çà me fais çà : (J’ai choisi la solution XmlReader/Writer parce que j’avais commencé par là).

 

XmlTextReader reader = new XmlTextReader(Server.MapPath(“test.svg”));

XmlTextWriter writer = new XmlTextWriter (Server.MapPath(“test_out.svg”),Encoding.Unicode);

writer.Formatting = Formatting.Indented;
writer.WriteStartDocument(false);

writer.WriteDocType(“svg”, “-//W3C//DTD SVG 20010904//EN”,“http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd”, null);

writer.WriteStartElement(“svg”);
writer.WriteStartElement(“style”);
writer.WriteStartAttribute(null,“type”,null);
writer.WriteString(“text/css”);
writer.WriteCData(“text{font: “+ Request.QueryString[“sizeFont”] +” “+ Request.QueryString[“familyFont”] +”; fill:”+ Request.QueryString[“colorFont”] +";} polygon{stroke:"+ Request.QueryString[“strokeColor”] +";stroke-width:"+ Request.QueryString[“widthStroke”] +" ; stroke-miterlimit:10;}");

if (Request.QueryString[“fillColor”] ==  “”)
{

 if (Request.QueryString[“fillColor1”] != “”)
 {
writer.WriteCData(".Fill1{fill:"+ Request.QueryString[“fillColor1”].ToString() +";}");
 }

 if (Request.QueryString[“fillColor2”] != “”)
{
 writer.WriteCData(" .Fill2{fill:"+ Request.QueryString[“fillColor2”].ToString() +";}");
}

 if (Request.QueryString[“fillColor3”] != “”)
 {
 writer.WriteCData(" .Fill3{fill:"+ Request.QueryString[“fillColor3”].ToString() +";}");
 }

 if (Request.QueryString[“fillColor4”] != “”)
 {
 writer.WriteCData(" .Fill4{fill:"+ Request.QueryString[“fillColor4”].ToString() +";}");
 }

}
else
{
 writer.WriteCData(".Fill1{fill:"+ Request.QueryString[“fillColor”].ToString() +";} .Fill2{fill:"+ Request.QueryString[“fillColor”].ToString() +";} .Fill3{fill:"+ Request.QueryString[“fillColor”].ToString() +";} .Fill4{fill:"+ Request.QueryString[“fillColor”].ToString() + “;}”);
}

writer.WriteEndElement();

while (reader.Read())

 if (reader.NodeType == XmlNodeType.Element) 
 {
if (reader.Name.Equals(“g”))
{
if (reader.GetAttribute(“id”) == Request.QueryString[“contenuXML”])
{
writer.WriteNode(reader,true);

		}
  }

  if (reader.Name.Equals("text"))
  {
	&nbsp;if (reader.GetAttribute("id") == "N-"+Request.QueryString["contenuXML"])
	&nbsp;{
		writer.WriteStartElement("g");
		writer.WriteStartAttribute(null,"id",null);
		writer.WriteString("NOM");
		writer.WriteNode(reader,true);
		writer.WriteEndElement();
	&nbsp;}
  }
&nbsp;}

}
writer.WriteEndElement();
reader.Close();
writer.Close(); &nbsp;

C’est un peu bourrin mais bon…