c# - obtener - ¿Cuál es la forma más eficiente de localizar y establecer valores de elementos en un XDocument?
xelement c# (1)
¿Esto lo hace por ti? Buena propiedad de descendientes.
string xmlInput = ...;
XDocument myDoc = XDocument.Parse(xmlInput);
//
List<XElement> someElements = myDoc.Descendants("a").ToList();
someElements.ForEach(x => x.Value = "Foo");
//
Console.WriteLine(myDoc);
Hmm, veo que tienes un atributo allí. Puede hacer eso también:
string xmlInput = //...
XDocument myDoc = XDocument.Parse(xmlInput);
//
List<XText> someText =
myDoc.Descendants()
.Nodes()
.OfType<XText>()
.Where(x => x.Value.StartsWith("{") && x.Value.EndsWith("}"))
.ToList();
//
List<XAttribute> someAttributes =
myDoc.Descendants()
.Attributes()
.Where(x => x.Value.StartsWith("{") && x.Value.EndsWith("}"))
.ToList();
//
someText.ForEach(x => x.Value = "Foo");
someAttributes.ForEach(x => x.Value = "Bar");
//
Console.WriteLine(myDoc);
Ah, ahora con lo que estás esperando, lo haré funcionar:
List<XElement> e = myDoc.Descendants("a").ToList();
e.Where(x => x.Attribute("name").Value == "username").Single().Value = "abc";
e.Where(x => x.Attribute("name").Value == "password").Single().Value = "abc";
Dada la siguiente ''plantilla'' XML:
<Request module="CRM" call="list_service_features" id="{ID}">
<block name="auth">
<a name="username" format="text">{USERNAME}</a>
<a name="password" format="password">{PASSWORD}</a>
<a name="client-id" format="counting">{CLIENT-ID}</a>
</block>
<a name="service-id" format="counting">{SERVICE-ID}</a>
</Request>
Usando XDocument, ¿cuál es la mejor manera de establecer los valores en llaves? Llegué tan lejos pero me quedé atrapado en la mejor manera de seleccionar cada uno de los tres <a />
nodos dentro del elemento <block/>
. Esto es solo un pequeño fragmento de XML, otros pueden tener hasta 20 elementos <a name="..."></a>
.
La forma en que se construye el XML no fue mi creación, es lo que tenemos que enviar al ''servicio web'' de nuestro proveedor ... antes de que alguien se ría del atributo format = "contar" :)
@David - aplausos por la respuesta, apreciada. Esperaba que fuera un poco más elegante, algo así como:
List<XElement> e = doc.Descendants("a").ToList();
e.Where(x => x.Attributes("name") == "username").Single().Value = "abc";
e.Where(x => x.Attributes("name") == "password").Single().Value = "abc";
Claramente, el código anterior no funciona, pero pensé que habría un trazador de líneas elegante para cada una de las etiquetas <a>