繁体   English   中英

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

[英]XPath query to modify an xml document in C#

我正在尝试通过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。

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操作来定位所需的连接。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM