【问题标题】:What's the most efficient way to locate and set element values in an XDocument?在 XDocument 中定位和设置元素值的最有效方法是什么?
【发布时间】:2023-03-05 03:45:01
【问题描述】:

给定以下 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,在花括号中设置值的最佳方法是什么。到目前为止,我陷入了选择&lt;block/&gt; 元素内的三个&lt;a /&gt; 节点中的每一个的最佳方法上。这只是 XML 的一小部分,其他的可能有多达 20 个 &lt;a name="..."&gt;&lt;/a&gt; 元素。

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

显然上面的代码不起作用,但我认为每个&lt;a&gt; 标签都会有一个优雅的衬线

【问题讨论】:

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


    【解决方案1】:

    这对你有用吗?好古老的后裔财产。

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

    【讨论】:

    • 是的,这就是我要找的。我得到了类似但更笨重的东西: e.Attributes("name").Where(a => a.Value == "username").Single().Parent.Value = "abcdef";非常感谢!
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 2010-10-02
    • 2019-06-30
    • 1970-01-01
    • 2017-05-10
    • 2016-07-11
    相关资源
    最近更新 更多