【问题标题】:Change xml value using linq in c#在 C# 中使用 linq 更改 xml 值
【发布时间】:2018-05-30 22:38:57
【问题描述】:

自过去 2 小时以来我一直在处理这个问题。我有一个 XML 文件,看起来像这样

<catalog>
  <captureInfo>
    <row>5</row>
    <col>5</col>
  </captureInfo>

  <patientInfo>
    <name>XYZ</name>
    <detail>details here</detail>
  </patientInfo>

  <imageData>
    <r0c0>
      <contrastFlag>true</contrastFlag>
    </r0c0>
  <imageData>
<catalog>

我想改变 contrastFlag 的值。我试过了,但它不起作用

XDocument xdoc = XDocument.Load(filename)
xdoc.Element("catalog")
                .Element("imageData")
                .Descendants()
                .Where(x => x.Value == "r0c0")
                .First()
                .SetElementValue("contrastFlag", "newValue");


            doc.Save("XMLFile1.xml");

我能知道我哪里出错了吗?正确的方法是什么?

【问题讨论】:

  • 将 where 条件更改为 x.Name == "r0c0"
  • 我收到此错误 - “System.NullReferenceException:对象引用未设置为对象的实例”
  • &lt;imageData&gt;&lt;catalog&gt; 标签没有正确关闭,但在修复之后,这对我有用xdoc.Element("catalog").Element("imageData").Element("r0c0").SetElementValue("contrastFlag", "newValue");
  • 从:.Where(x => x.Value == "r0c0") 到:.Where(x => x.Name.LocalName == "r0c0")

标签: c# xml visual-studio linq


【解决方案1】:

不清楚您是否有多个 contrastFlag 元素。

如果只有一个,你可以这样做:

XDocument xdoc = XDocument.Load(filename);
var element = xdoc.Root.Descendants("contrastFlag").FirstOrDefault();
if (element != null)
    element.Value = "false";
xdoc.Save("sample1.xml");

如果你有多个元素,你可以改用XPath

XDocument xdoc = XDocument.Load(filename);
var element = xdoc.Root.XPathSelectElement("//catalog//imageData//r0c0//contrastFlag");
if (element != null)
    element.Value = "false";
xdoc.Save("sample1.xml");

注意:

XPath 位于 using System.Xml.XPath 命名空间中。

【讨论】:

    【解决方案2】:
    .Where(x => x.Name == "r0c0") 
    

    改为 this 而不是 x.Value 因为它是一个元素名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多