给出以下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>
标签都会有一个优雅的衬垫
答案 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";