1

给定以下 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 的构造方式不是我创造的,这是我们必须发送到供应商的“网络服务”的方式......在任何人嘲笑 format="counting" 属性之前:)

@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>标签都会有一个优雅的衬里

4

1 回答 1

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";
于 2008-11-18T19:44:15.657 回答