在XDocument中定位和设置元素值的最有效方法是什么?

时间:2008-11-18 18:52:32

标签: c# .net xml linq-to-xml

给出以下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>

使用XDocument,在花括号中设置值的最佳方法是什么。到目前为止,我已经陷入了选择<a />元素中三个<block/>节点中每个节点的最佳方式。这只是XML的一小部分,其他可能最多包含20个<a name="..."></a>元素。

构建XML的方式不是我的创建,而是我们必须发送给供应商的“网络服务”......在任何人对格式=“计数”属性发笑之前:)

@David - 为回应欢呼,赞赏。我有点希望它有点优雅,有点像:

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";

显然上面的代码不起作用,但我认为每个<a>标签都会有一个优雅的衬垫

1 个答案:

答案 0 :(得分:3)

这样做适合你吗?好旧的后裔财产。

string xmlInput = ...;
XDocument myDoc = XDocument.Parse(xmlInput);
//
List<XElement> someElements = myDoc.Descendants("a").ToList();
someElements.ForEach(x => x.Value = "Foo");
//
Console.WriteLine(myDoc);
嗯,我看到你有一个属性。也可以这样做:

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);

啊,现在有了你所期待的,我会让它发挥作用:

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";