C# 删除所有未用XML大括号括起来的文本

C# 删除所有未用XML大括号括起来的文本,c#,xml,xdoc,C#,Xml,Xdoc,我想从XML文档中删除所有无效文本。我认为任何未封装在XML括号内的文本都是无效的,并且希望在翻译之前剥离这些文本。 本文将解释如何将XML括号匹配在一起。然而,在我的示例中,它并没有像在本例中看到的那样清除XML之外的文本 我认为从我最初的研究来看,在S/O上没有人问过这个具体的例子 目前,在我的代码中,我将此XML作为字符串,然后再使用它编写XDocument。因此,我有可能使用string、Regex和XDocument方法来帮助删除这些内容,这些文档中可能还存在一位以上的无效XML。此外

我想从XML文档中删除所有无效文本。我认为任何未封装在XML括号内的文本都是无效的,并且希望在翻译之前剥离这些文本。 本文将解释如何将XML括号匹配在一起。然而,在我的示例中,它并没有像在本例中看到的那样清除XML之外的文本

我认为从我最初的研究来看,在S/O上没有人问过这个具体的例子

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


我尝试过的一个非常基本的想法是将字符串作为一个字符数组进行迭代,如果它在“>”和“之外,则尝试将其删除。您可以执行以下操作。请注意,我做了非常有限的测试,如果在某些情况下失败,请告诉我

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;
}
}
公共静态类扩展
{
公共静态JToken RemoveFields(此JToken令牌)
{
JContainer container=作为JContainer的令牌;
if(container==null)返回令牌;
List removeList=新列表();
foreach(容器中的JToken el.Children())
{
JProperty p=el作为JProperty;
if(p!=null&&p.Name.StartsWith(“#”)
{
删除列表。添加(el);
}
el.RemoveFields();
}
foreach(JToken el in removeList)
el.移除();
返回令牌;
}
}
输出

<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

您好,我没有按照标签所示使用Java,因此无法测试您的代码。此外,您的输出与我要查找的内容不匹配,因为您在我的架构周围附加了一个元素:(@EightSquared我已经修复了“”问题,这是我这边的一个错误。顺便说一句,你为什么觉得这是Java?这是C代码:)如果你因为JToken而感到如此,那是来自Json.Net包。嘿,Anu。对您的代码进行进一步调查后,它会按预期工作。我需要修改我的代码以反映这个扩展。你对Json.net包的看法也是对的——我假设它是Java!
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>