【问题标题】:Extract XSD from top off XML file从顶级 XML 文件中提取 XSD
【发布时间】:2021-06-16 17:51:35
【问题描述】:
有人要求我编写一个针对 XSD 验证 XML 的程序。这是一个简单的部分(我知道有很多帖子都在谈论它)。
我的问题是:XSD 包含在 XML 文件中,我不知道如何将其提取到单独的文件中以供解析器验证。
附图是我需要处理的文件类型的一个例子,但这是一个非常简单的文件。我们有最大 220MB 大小的 XML 文件,所以这需要高效 :D 提前谢谢大家,
塞缪尔。
https://i.stack.imgur.com/xfkKt.png
【问题讨论】:
标签:
xml
validation
parsing
xsd
【解决方案1】:
我总是觉得根据文件附带的架构验证文件毫无意义 - 如果您不相信文件是有效的,为什么要相信它包含有用的架构?但是,如果这是您想要做的,那么 (a) 一些验证 API 可能允许您直接从其嵌入位置编译模式,并且 (b) 如果您选择的模式处理器没有,那么可以使用普通的 XSLT 或 XQuery - 例如 Saxon 命令
java net.sf.saxon.Query -s:doc.xml -qs:"//xs:schema" -o:schema.xsd
为了获得更好的性能,为了避免解析整个 220Mb,您可以使用流式 XSLT 3.0 转换来提取架构:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="3.0">
<xsl:mode streamable="yes"/>
<xsl:template match="/">
<xsl:copy-of select="/*/xs:schema[1]"/>
</xsl:template>
</xsl:transform>
[1] 告诉处理器它可以在处理完第一个 xs:schema 元素后停止读取输入。