web-dev-qa-db-fra.com

Changer les noms de nœud dans un fichier XML en utilisant C #

J'ai un énorme groupe de fichiers XML avec la structure suivante:

<Stuff1>
  <Content>someContent</name>
  <type>someType</type>
</Stuff1>
<Stuff2>
  <Content>someContent</name>
  <type>someType</type>
</Stuff2>
<Stuff3>
  <Content>someContent</name>
  <type>someType</type>
</Stuff3>
...
...

Je dois changer chacun des noms de nœud "Contenu" en StuffxContent; ajoutez généralement le nom du noeud parent au nom du noeud de contenu.

J'avais prévu d'utiliser la classe XMLDocument pour trouver un moyen, mais je me demandais s'il y avait de meilleures façons de le faire.

14
sundeep

(1.) La propriété [XmlElement/XmlNode] .Name est en lecture seule.

(2.) La structure XML utilisée dans la question est grossière et pourrait être améliorée.

(3.) Peu importe, voici une solution de code à la question posée:

String sampleXml =
  "<doc>"+
    "<Stuff1>"+
      "<Content>someContent</Content>"+
      "<type>someType</type>"+
    "</Stuff1>"+
    "<Stuff2>"+
      "<Content>someContent</Content>"+
      "<type>someType</type>"+
    "</Stuff2>"+
    "<Stuff3>"+
      "<Content>someContent</Content>"+
      "<type>someType</type>"+
    "</Stuff3>"+
  "</doc>";

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(sampleXml);

XmlNodeList stuffNodeList = xmlDoc.SelectNodes("//*[starts-with(name(), 'Stuff')]");

foreach (XmlNode stuffNode in stuffNodeList)
{
    // get existing 'Content' node
    XmlNode contentNode = stuffNode.SelectSingleNode("Content");

    // create new (renamed) Content node
    XmlNode newNode = xmlDoc.CreateElement(contentNode.Name + stuffNode.Name);

    // [if needed] copy existing Content children
    //newNode.InnerXml = stuffNode.InnerXml;

    // replace existing Content node with newly renamed Content node
    stuffNode.InsertBefore(newNode, contentNode);
    stuffNode.RemoveChild(contentNode);
}

//xmlDoc.Save

PS: Je suis venu ici pour trouver un moyen plus agréable de renommer un nœud/un élément; Je suis toujours en train de regarder.

53
Omar

Le moyen le plus simple que j'ai trouvé pour renommer un nœud est:

xmlNode.InnerXmL = newNode.InnerXml.Replace("OldName>", "NewName>")

N'incluez pas le < d'ouverture pour vous assurer que la balise </OldName> de fermeture est également renommée.

3
Marc

Chargez-le sous forme de chaîne et remplacez le tout.

    String sampleXml =
  "<doc>"+
    "<Stuff1>"+
      "<Content>someContent</Content>"+
      "<type>someType</type>"+
    "</Stuff1>"+
    "<Stuff2>"+
      "<Content>someContent</Content>"+
      "<type>someType</type>"+
    "</Stuff2>"+
    "<Stuff3>"+
      "<Content>someContent</Content>"+
      "<type>someType</type>"+
    "</Stuff3>"+
  "</doc>"; 

    sampleXml = sampleXml.Replace("Content","StuffxContent")
0
timothy

Je vais répondre à la question plus haute: pourquoi essayez-vous cela avec XmlDocument?

Je pense que la meilleure façon d'accomplir ce que vous visez est un simple fichier XSLT
qui correspondent au nœud "CONTENTSTUFF" et génèrent un nœud "CONTENT" ...

ne vois pas de raison d'avoir des armes aussi lourdes ...

De toute façon, si vous souhaitez toujours le faire, vous devez utiliser le style C #,
Utilisez XmlReader + XmlWriter et non XmlDocument à des fins de mémoire et de rapidité. XmlDocument stocke l'intégralité du XML en mémoire, ce qui le rend très lourd pour Traverser une fois ...

XmlDocument est bon si vous accédez à l'élément plusieurs fois (pas la situation ici).

0
Tomer W

Une meilleure solution consisterait peut-être à parcourir chaque noeud et à écrire les informations dans un nouveau document. Évidemment, cela dépendra de la manière dont vous utiliserez les données à l'avenir, mais je recommanderais le même reformatage que celui suggéré par FlySwat ...

<stuff id="1">
    <content/>
</stuff>

Je suggérerais également que l'utilisation du XDocument récemment ajouté serait le meilleur moyen de créer le nouveau document.

0
ZombieSheep