XPath查询以修改C#中的xml文档

时间:2019-05-02 16:30:53

标签: c# xml xpath

我正在尝试通过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"); 读取数据,但它为null。我想通过代码更改test-data1或test-data2。

2 个答案:

答案 0 :(得分:0)

XPathSelectElement将只能从文档中选择元素,而XPath试图选择属性。

因此,您可以选择这样的父元素,然后使用SetAttributeValue来更改属性。

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

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

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

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

答案 1 :(得分:0)

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("");
    }