删除所有未用XML大括号包裹的文本

时间:2019-01-03 04:35:36

标签: c# xml xdoc

我想从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>

1 个答案:

答案 0 :(得分: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