【问题标题】:Remove all text not wrapped in XML braces删除所有未包含在 XML 大括号中的文本
【发布时间】:2019-01-03 04:35:36
【问题描述】:

我想从 XML 文档中删除所有无效文本。我认为任何未包含在 XML 括号中的文本都是无效的,并且希望在翻译之前删除这些文本。

来自这篇文章Regular expression to remove text outside the tags in a string - 它解释了如何将 XML 括号匹配在一起。但是,在我的示例中,它不会清理 XML 之外的文本,如本示例所示。 https://regex101.com/r/6iUyia/1

在我最初的研究之前,我认为在 S/O 上没有问过这个具体的例子。

目前在我的代码中,我将这个 XML 作为一个字符串,然后再用它编写一个 XDocument。所以我可能有可用的字符串、Regex 和 XDocument 方法来帮助删除它,这些文档中可能还存在不止一位无效的 XML。此外,我不希望使用 XSLT 删除这些值。

我尝试编写但失败的一个非常基本的想法是将字符串作为 char 数组进行迭代,如果它在 '>' 和 '

这是一个输入示例,在嵌套 A 和嵌套 B 之间显示无效文本

 <ASchema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns:fn="http://www.w3.org/2005/xpath-functions">
   <A>
         <nested-A>valid text</nested-A>
         Remove text not inside valid xml braces
         <nested-B>more valid text here</nested-B>
   </A>
</ASchema>

我希望输出格式如下。

 <ASchema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns:fn="http://www.w3.org/2005/xpath-functions">
   <A>
         <nested-A>valid text</nested-A>
         <nested-B>more valid text here</nested-B>
   </A>
</ASchema>

【问题讨论】:

    标签: c# xml xdoc


    【解决方案1】:

    您可以执行以下操作。请注意,我所做的测试非常有限,如果在某些情况下失败,请告诉我。

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(str);
    var json = JsonConvert.SerializeXmlNode(doc);
    
    string result = JToken.Parse(json).RemoveFields().ToString(Newtonsoft.Json.Formatting.None);
    var xml = (XmlDocument)JsonConvert.DeserializeXmlNode(result);
    

    RemoveFields 被定义为

    public static class Extensions
    {
    public static JToken RemoveFields(this JToken token)
    {
        JContainer container = token as JContainer;
        if (container == null) return token;
    
        List<JToken> removeList = new List<JToken>();
        foreach (JToken el in container.Children())
        {
            JProperty p = el as JProperty;
            if (p != null && p.Name.StartsWith("#"))
            {
                removeList.Add(el);
            }
            el.RemoveFields();
        }
    
        foreach (JToken el in removeList)
            el.Remove();
    
        return token;
    }
    }
    

    输出

    <ASchema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns:fn="http://www.w3.org/2005/xpath-functions">
       <A>
          <nested-A>valid text</nested-A>
          <nested-B>more valid text here</nested-B>
       </A>
    </ASchema>
    

    请注意我在上面的代码中使用了 Json.net

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多