【问题标题】:Using XPath to delete and write new nodes in C#在 C# 中使用 XPath 删除和写入新节点
【发布时间】:2017-03-05 03:10:18
【问题描述】:

我希望删除然后将新节点/值添加到 Xml 文件中。

这是 Xml 内容的简化版本:

<?xml version="1.0" encoding="utf-8"?>
<NinjaTrader>
    <OpenWorkspaces>
        <OpenWorkspace>OldWorkspace1</OpenWorkspace>
        <OpenWorkspace>OldWorkspace2</OpenWorkspace>
    </OpenWorkspaces>
</NinjaTrader>

所以基本上我想删除 OpenWorkspaces 的所有子项:

<?xml version="1.0" encoding="utf-8"?>
<NinjaTrader>
   <OpenWorkspaces>
   </OpenWorkspaces>
</NinjaTrader>

然后我想添加新的节点和值。 “NewWorkspace1 到 NewWorkspace4”的值将来自一个字符串数组。

<?xml version="1.0" encoding="utf-8"?>
<NinjaTrader>
   <OpenWorkspaces>
       <OpenWorkspace>NewWorkspace1</OpenWorkspace>
       <OpenWorkspace>NewWorkspace2</OpenWorkspace>
       <OpenWorkspace>NewWorkspace3</OpenWorkspace>
       <OpenWorkspace>NewWorkspace4</OpenWorkspace>
   </OpenWorkspaces>
</NinjaTrader>

我想删除孩子然后创建新孩子的原因是因为我可能有与原始孩子不同的数量,如上面的示例所示。

所以我尝试使用“删除”开始:

var xdoc = XDocument.Load(myPath);
xdoc.XPathSelectElements("//OpenWorkspaces").Descendants("OpenWorkspace").Remove();

所做的就是这样:

<NinjaTrader>
    <OpenWorkspaces />
</NinjaTrader>

我在 C# 方面相当胜任,但不是 Xml。我花了几个小时试验 XPath 扩展,但对结果有点失望。因此,非常欢迎朝着正确的方向前进。谢谢。

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:

    既然你已经完成了删除部分,添加新元素可以通过将你的字符串数组投影到一系列XElements 并将结果传递给XElement.Add() 方法来完成。这是一个最小但完整的示例:

    var raw = @"<NinjaTrader>
        <OpenWorkspaces>
            <OpenWorkspace>OldWorkspace1</OpenWorkspace>
            <OpenWorkspace>OldWorkspace2</OpenWorkspace>
        </OpenWorkspaces>
    </NinjaTrader>";
    var xdoc = XDocument.Parse(raw);
    List<string> newValues = new List<string>{"NewWorkspace1","NewWorkspace2","NewWorkspace3"};
    
    var ow = xdoc.XPathSelectElement("//OpenWorkspaces");
    
    ow.Descendants("OpenWorkspace").Remove();
    ow.Add(newValues.Select(o => new XElement("OpenWorkspace", o)));
    
    Console.WriteLine(xdoc.ToString());
    

    dotnetfiddle demo

    【讨论】:

    • 我只是简单地替换了: var xdoc = XDocument.Load(myPath);对于 var raw。我标记了你的答案,但由于我没有足够的声誉,它还不会显示给我。
    • 没问题。现在勾选复选标记就足够了。如果您愿意,一旦获得足够的代表,您随时可以回来投票
    猜你喜欢
    • 2021-04-22
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    相关资源
    最近更新 更多