Tengo dos objetos XML serializados como:

<car id="1">
  <name>Renault</name>
  <type>
    <gear>Manual</gear>
    <petrol>Gas</petrol>
    <model>11</model>
  </type>
  <status>Available</status>
</car>

Y otra solo siendo una etiqueta:

<type>
 <gear>Automatic</gear>
</type>

Quiero reemplazar el tipo de nodo del primer objeto con el nodo del segundo objeto.

Lo intenté:

string output = Regex.Replace(input, @"<type>(.*)</type>", replacement, RegexOptions.IgnoreCase);

Pero no da el resultado deseado. ¿Alguna sugerencia?

c#
0
user8333405 17 feb. 2018 a las 13:14

2 respuestas

La mejor respuesta

Puedes hacer esto mi XmlDocument:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("<car id=\"1\"><name>Renault</name><type><gear>Manual</gear><petrol>Gas</petrol><model>11</model></type><status>Available</status></car>");

var typeNode = xmlDoc.SelectSingleNode("descendant::car[@id='1']/type");

if (typeNode != null) typeNode.InnerText = "<gear>Automatic</gear>";

string str = xmlDoc.InnerXml;
0
FaizanHussainRabbani 17 feb. 2018 a las 10:39

Puedes usar tu propia función con subcadena, como esta

    private void button1_Click(object sender, EventArgs e)
    {
       MessageBox.Show(NodeReplace(xml, "type",value));
    }

    public string NodeReplace(string xml, string nodeToFind, string newValue)
    {
        int start = xml.IndexOf("<" + nodeToFind);
        int end = xml.IndexOf("</" + nodeToFind + ">");

        string toreplace = xml.Substring(start, end + 3 + (nodeToFind.Length) - start);
        xml = xml.Replace(toreplace, newValue);
        return xml;
    }

Pero si quieres una recomendación, creo que es mejor serializar con una clase y simplemente reemplazar tu nodo como una variable

0
polzka90 17 feb. 2018 a las 13:49