【问题标题】:Find and delete all occurrences of a string that starts with x查找并删除所有出现的以 x 开头的字符串
【发布时间】:2015-06-10 22:58:12
【问题描述】:

我正在解析一个 XML 文件,以将其与另一个 XML 文件进行比较。 XML Diff 工作得很好,但我们发现一个文件中存在很多垃圾标签,而不是另一个文件,它们与我们的结果无关,但会使报告变得混乱。我已将 XML 文件加载到内存中以对其执行一些其他操作,并且我想知道是否有一种简单的方法可以同时浏览该文件,并删除所有以开头的标签,例如 color= .颜色的值是全图的,不容易抓到都去掉。

在 XML Diff 中似乎没有任何方式可以指定“忽略这些标签”。

我可以翻阅文件,找到每个实例,找到它的结尾,将其删除,但我希望会有更简单的东西。如果没有,那好吧。

编辑:这是一段 XML:

<numericValue color="-103" hidden="no" image="stuff.jpg" key="More stuff." needsQuestionFormatting="false" system="yes" systemEquivKey="Stuff." systemImage="yes">
    <numDef increment="1" maximum="180" minimum="30">
        <unit deprecated="no" key="BPM" system="yes" />
   </numDef>
</numericValue>

【问题讨论】:

  • 选择//*['contains(local-name(), "color")]等XPath的所有节点并删除?
  • 用什么?你可以在 c# 中的字符串替换中使用 xpath 吗?
  • 所以您想使用字符串操作来编辑 XML - 祝您好运。我无法阻止您这样做,但请考虑其他更具体的 XML 工具,例如 XDocument/XmlDocument 类。
  • 不绑定任何东西。因为我已经为其他目的加载了它,所以很容易。

标签: c# regex xml xmldiff


【解决方案1】:

如果您使用的是 Linq to XML,您可以通过以下方式将您的 XML 加载到 XDocument

        var doc = XDocument.Parse(xml); // Load the XML from a string

或者

        var doc = XDocument.Load(fileName); // Load the XML from a file.

然后搜索所有具有匹配名称的元素并使用System.Xml.Linq.Extensions.Remove() 一次性删除它们:

        string prefix = "L"; // Or whatever.

        // Use doc.Root.Descendants() instead of doc.Descendants() to avoid accidentally removing the root element.
        var elements = doc.Root.Descendants().Where(e => e.Name.LocalName.StartsWith(prefix, StringComparison.Ordinal));
        elements.Remove();

更新

在您的 XML 中,color="-103" 子字符串是元素的 attribute,而不是元素本身。要删除所有此类属性,请使用以下方法:

    public static void RemovedNamedAttributes(XElement root, string attributeLocalNamePrefix)
    {
        if (root == null)
            throw new ArgumentNullException();
        foreach (var node in root.DescendantsAndSelf())
            node.Attributes().Where(a => a.Name.LocalName == attributeLocalNamePrefix).Remove();
    }

然后这样称呼它:

        var doc = XDocument.Parse(xml); // Load the XML

        RemovedNamedAttributes(doc.Root, "color");

【讨论】:

  • 不错。该xml变量的格式是什么?我刚刚将 xml 文件作为文件读入内存。
  • 这是一个字符串变量。
  • 似乎无法让它消失。我运行前缀设置为“颜色”的代码,但是当我写出来时,颜色元素仍然存在。它解析得很好,所以我假设它是有效的 XML。
  • @CargoMeister - 您要删除 color="-103" 属性还是整个 numericValue 元素?
  • 谢谢,我今天早上试试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 2020-04-12
  • 2015-11-08
  • 1970-01-01
相关资源
最近更新 更多