Me gustaría almacenar la sección original de una cadena XML, dividida por la base en cada elemento raíz de <ROW NUMBER="1"> y asignarla a una cadena.

¿Puedo saber cómo se puede hacer?

<?xml version="1.0"?>
<ROWS>
  <ROW NUMBER="1">
    <PersonID>P1</PersonID>
    <PersonName>JAMES</PersonName>
  </ROW>
  <ROW NUMBER="2">
    <PersonID>P2</PersonID>
    <PersonName>MARY</PersonName>
  </ROW>
</ROWS>

Resultado esperado:

string person1 = "<PersonID>P1</PersonID><PersonName>JAMES</PersonName>"

string person2 = "<PersonID>P2</PersonID><PersonName>MARY</PersonName>"

Gracias.

0
gymcode 12 mar. 2021 a las 12:23

2 respuestas

La mejor respuesta

Normalmente uso un diccionario como este:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, List<XElement>> dict = doc.Descendants("ROW")
                .GroupBy(x => (string)x.Element("PersonID"), y => y)
                .ToDictionary(x => x.Key, y => y.Descendants().ToList());

 
        }
    }
}
1
jdweng 12 mar. 2021 a las 13:40

Esto es relativamente trivial:

var xml = "<?xml version=\"1.0\"?><ROWS>  <ROW NUMBER=\"1\">    <PersonID>P1</PersonID>    <PersonName>JAMES</PersonName>  </ROW>  <ROW NUMBER=\"2\">    <PersonID>P2</PersonID>    <PersonName>MARY</PersonName>  </ROW></ROWS>";

// Load XML into XmlDocument
var doc = new XmlDocument();
doc.LoadXml(xml);

// Select the ROW nodes
var nodes = doc.SelectNodes("/ROWS/ROW");

// Select the value of the NUMBER attribue and the InnerXML into an anonymous object
// and convert into a dictionary with the key personX (where X is the value of the NUMBER attribute)
var dictionary = nodes
    .Cast<XmlNode>()
    .Select(n => new { Row = n.Attributes["NUMBER"].Value, Xml = n.InnerXml })
    .ToDictionary(r => $"person{r.Row}", r => r.Xml);

Descargo de responsabilidad: la parte ToDictionary fallará si existe un valor de atributo NUMBER duplicado (DuplicateKeyException). Es posible que deba escribir algún código para manejarlo.

0
Llama 12 mar. 2021 a las 09:46