C#从xml中删除无效字符[重复]

Posted

技术标签:

【中文标题】C#从xml中删除无效字符[重复]【英文标题】:C# removing invalid characters from xml [duplicate] 【发布时间】:2017-04-08 22:41:11 【问题描述】:

我需要读入一个不符合 xml 规则的 xml 文件。所以我需要在我可以将它作为 xml 文件读取之前把它做好。它在元素之间存在诸如“&”和“

<MAT>
<MATERIAL><MATNR>2286303</MATNR><BESTELTXT>Parts for something & something else</BESTELTXT><WERKS>Material exist out of<1 something</WERKS>
</MAT>

现在我有这个:

我读入文件然后我这样做

            text = Regex.Replace(text, @"\s&\s", " &amp; ");
            text = Regex.Replace(text, @"[<]\d+", "&lt;");

之后我将文本写入文件,然后我将其作为 xml 读入。

ps:我知道这应该在制作 xml 文件时进行处理,但它来自第三方,他们无法更改。

【问题讨论】:

他们不能改变吗?然后更改该供应商 他们没有为你提供一个有效的 XML 文件,你不能指望把它当作一个来阅读。 @Thomas 是的,这很有趣,但通常这不是开发人员的决定权。 @Jamiec 我必须同意你的观点,但我们别无选择,所以就像 CodeCaster 说的那样,这不是我决定的地方。我问过他们并让他们知道,但答案是不可能,所以我坚持下去。 @BramV 看到我 100% 不同意编解码器。 开发者 IMO 的责任。如果我有报酬成为一名开发人员,那么有人会为我的知识和经验买单。如果这告诉我他们正在使用一个糟糕的供应商,那么该死的,我会向付钱给我的人说清楚。 【参考方案1】:

你应该试试这个

text = Regex.Replace(text, @"(\s+)&(\s+)", "$1&amp;$2");
text = Regex.Replace(text, @"[<](\d+)", "&lt;$1");
首先将 \s 更改为 \s+ 以选择 &,即使它被多个空格包围,但使用 + 意味着少于一个空格。 第二次将\d+ 更改为(\d+) 通过这样做,我能够使用包含所选数字值的$1,同样的事情适用于 \s+,如果您有多个选定的组,则顺序将是 1 美元、2 美元等。 为了提高性能,您可以将RegexOptions.Compiled 添加到您的正则表达式中,例如text = Regex.Replace(text, @"(\s+)&amp;(\s+)", "$1&amp;amp;$2",RegexOptions.Compiled);

此外,如果您想更改所有 &amp;,则必须删除 (\s+)

【讨论】:

请解释您更改的内容,而不是“试试这个”。 以及你为什么改变它 @CodeCaster 够了吗?我没有解释,因为这些是正则表达式世界中的基本内容 如果 OP 精通 Regex 世界中的基本知识,他们就不必问这个问题了,不是吗?但是,是的,这是您添加的一个很好的解释,请点赞。 这是一个很好的观点,谢谢。

以上是关于C#从xml中删除无效字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从java中的字符串中删除无效的XML字符

C#从数据库中提取数据生成XML文件,系统报错,提示"♀(十六进制值0x0c)是无效的字符"

从C#中的xml字符串获取元素[重复]

XML(反)序列化无效字符串在c#中不一致?

从 html 字符串中删除无效/错误放置的标签

C#十六进制值0x12,是无效字符