【问题标题】:XPath query to modify an xml document in C#在 C# 中修改 xml 文档的 XPath 查询
【发布时间】:2019-05-02 16:30:53
【问题描述】:

我正在尝试通过 Xpath 和 C# 更改“test-data1”字符串。一开始就无法接近甚至获得价值。

任何帮助表示赞赏。

<Dashboard>
  <Title Text="view1" />
  <DataSources>
    <SqlDataSource Name="DS1" ComponentName="sqlDataSource1">
      <Connection Name="DEV1" ConnectionString="test-data1" />
      <Connection Name="DEV2" ConnectionString="test-data2" />
      <ConnectionOptions CloseConnection="true" />
    </SqlDataSource>
  </DataSources>
</Dashboard>

我试过xml.XPathSelectElement("//SqlDataSource/Connection/@ConnectionString"); 也读取数据,但它为空。我想通过代码更改 test-data1 或 test-data2。

【问题讨论】:

  • xml.SelectSingleNode("//SqlDataSource/Connection[@ConnectionString='test-data1']') 这将为您提供Connection 节点,以便您可以更改其属性。
  • 我查询的是读数据,不是写数据。

标签: c# xml xpath


【解决方案1】:

XPathSelectElement 将只能从您的文档中选择元素,而您的 XPath 正在尝试选择一个属性。

因此,您可以像这样专门选择父元素,并使用SetAttributeValue更改属性。

var connectionElement = xml.XPathSelectElement("//SqlDataSource/Connection[@Name='DEV1']");
connectionElement.SetAttributeValue("ConnectionString", "Hello, world");

如果您不知道连接的名称,则可以改为使用 XPathSelectElements 迭代连接元素的集合以执行您的操作,这将返回可能与 XPath 匹配的许多元素。例如,如果您只想更改遇到的第一个 Connection 元素,您可以这样做:

var connectionElement = xml.XPathSelectElements("//SqlDataSource/Connection").First();
connectionElement.SetAttributeValue("ConnectionString", "Hello, world");

在这种情况下使用 First() 获取第一个连接元素 - 同样,您可以使用带有索引的 ElementAt 或任何其他 Linq 操作来定位所需的连接。

【讨论】:

  • 谢谢@steve。但我也不会事先知道名称,所以我如何选择没有名称“DEV1”的属性值,但可能是通过索引或其他方式?
  • 谢谢@steve16351,我终于搞定了。非常感谢。
  • 有没有办法在 setAttribute 之前获取原始属性值?像 connectionElement.GetAttributeValue("ConnectionString") ?
  • connectionElement.Attribute("ConnectionString").Value
【解决方案2】:

XPathSelectElement 期望查询选择一个元素 (XElement)。你 xpath 查询选择一个属性,所以它不能很好地工作。下面是一个修改连接字符串DEV1的值的例子:

    static void Main(string[] args)
    {
        var xml = @"<Dashboard>...</Dashboard>";

        var document = XDocument.Parse(xml);
        var item = document.XPathSelectElement("//SqlDataSource/Connection[@Name='DEV1']");
        item.SetAttributeValue("ConnectionString", "new value");
        Console.WriteLine(document.ToString());
        //document.Save("");
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多