清理无效的 xml 字符串,使其成为有效的 xml

Posted

技术标签:

【中文标题】清理无效的 xml 字符串,使其成为有效的 xml【英文标题】:Clean an invalide xml string, to make it valide xml 【发布时间】:2021-11-01 16:16:57 【问题描述】:

我有一个无效的 xml 文件(由多个 xml 文件的串联产生)。是否可以从这里清除不需要的重复节点(root 和 xml):

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Client>client1</Client>
    <ClientType>1</ClientType>
</root><?xml version="1.0">
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Client>client2</Client>
</root><?xml version="1.0" encoding="utf-8"?>
<root>
    <Client>client3</Client>    
</root>

到这里:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Client>client1</Client>
    <ClientType>1</ClientType>
    <Client>client2</Client>
    <Sex>1</Sex>
    <Client>client3</Client>
    <Sex>1</Sex>
</root>

我已经开始使用正则表达式来查找“xml”和“root”的出现,

var test = Regex.Matches(input, "<\\?xml").Count;

但我有两个困难: 1/ 删除除第一个和最后一个以外的所有根节点。 (也许使用 IndexOf 函数?) 2/ 管理稍有不同的节点,例如

 <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

 <root>

必须以同样的方式对待

【问题讨论】:

XmlSerializer 适用于不验证 xml 文件? 格式良好的 XML 仅在根标记上。您的 XML 格式不正确,但根据 XML 规范是有效的。在 Net 库中,您必须使用具有以下设置的 XmlReader: XmlReaderSettings settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment;我昨天用它来回答。请参阅:***.com/questions/69042159/… XML 无法容忍格式正确的错误,因此任何支持 XML 的应用程序都应该拒绝此类文档。试图即时修复解析错误可能是错误的方法,你应该问问自己你是否真的想要或需要这个。 XML类似于 html,语法错误通常是可以原谅的。 XML 类似于编程代码。一切都必须完美,否则就不是 XML。 【参考方案1】:

您可以尝试使用 XML 解析器。它会让你在所有这些文件中得到你需要的东西。然后,您可以创建一个新的,其中包含您需要的任何数据。

您可以从:https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xdocument.parse?view=net-5.0

【讨论】:

请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。【参考方案2】:

恕我直言,唯一的解决方案:使用 XML 解析器读取这两个文件,例如通过使用 2 个单独的 XmlDocument 对象,然后根据需要使用 copy XML nodes over,最后使用 write the altered object to a file。

这可能并不容易,尤其是。在处理命名空间时,但即便如此,这可能是获得良好、可靠结果的最佳方法。

【讨论】:

以上是关于清理无效的 xml 字符串,使其成为有效的 xml的主要内容,如果未能解决你的问题,请参考以下文章

xml Android - Drawable paiting line of dots(删除旋转标记使其成为水平)。来源= http://stackoverflow.com/a/20605455/

xml Android - Drawable paiting line of dots(删除旋转标记使其成为水平)。来源= http://stackoverflow.com/a/20605455/

xml Android - Drawable paiting line of dots(删除旋转标记使其成为水平)。来源= http://stackoverflow.com/a/20605455/

xml Android - Drawable paiting line of dots(删除旋转标记使其成为水平)。来源= http://stackoverflow.com/a/20605455/

xml Android - Drawable paiting line of dots(删除旋转标记使其成为水平)。来源= http://stackoverflow.com/a/20605455/

xml Android - Drawable paiting line of dots(删除旋转标记使其成为水平)。来源= http://stackoverflow.com/a/20605455/