gpt4 book ai didi

xml - 从非常大的xml文件中提取第一个k子级的简单方法(可能已损坏)

转载 作者:行者123 更新时间:2023-12-03 16:16:21 24 4
gpt4 key购买 nike

有没有一种简单的方法,可能是使用XPath查询(或可以在每台linux / osx机器中轻松找到的任何其他命令行工具)从大型XML文件中提取原始文件的子集?

具体来说,我有一个较大的xml文件,格式为:

<root>
<header>...<>
<item name="1">...<>
<item name="2">...<>
...
<item name="1000000">..<>
</root>


我想输出一个较小的XML文件,其中前k个项目(例如10)包括标题。作为附带说明,请考虑该文件可能已损坏。本质上,我正在寻找类似于 head的命令,该命令使用SAX解析器来解析XML文件(以便不占用内存并且对文件的过早终止具有弹性)。

最佳答案

我认为使用xsl:iterate进行流处理可以在Saxon 9.7 EE当前实现的XSLT 3.0中实现(显然这不是LINUX上容易使用的命令行工具,但是它确实解决了我认为值得一提的问题):假定格式为test2015122701.xml的格式不正确的XML

<root>
<header>...</header>
<item name="1">...</item>
<item name="2">...</item>
<item name="3">...</item>
<item name="4">...</item>
<item>
</root>


和带有代码的XSLT 3.0样式表

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">

<xsl:param name="items-to-copy" as="xs:integer" select="4"/>
<xsl:variable name="children-to-copy" as="xs:integer" select="$items-to-copy + 1"/>

<xsl:param name="input-uri" as="xs:string" select="'test2015122701.xml'"/>

<xsl:output indent="yes"/>

<xsl:template name="main" match="/">
<root>
<xsl:stream href="{$input-uri}">
<xsl:iterate select="root/*">
<xsl:copy-of select="."/>
<xsl:if test="position() eq $children-to-copy">
<xsl:break/>
</xsl:if>
</xsl:iterate>
</xsl:stream>
</root>
</xsl:template>

</xsl:stylesheet>


当与 java -jar saxon9ee.jar -it:main -xsl:sheet.xsl一起运行时,Saxon 9.7 EE会产生以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<header>...</header>
<item name="1">...</item>
<item name="2">...</item>
<item name="3">...</item>
<item name="4">...</item>
</root>


如果我们使用 -t命令行选项运行以检查有关处理的一些详细信息,我们将看到:

Streaming file:/C:/Users/Martin%20Honnen/Documents/xslt/test2015122701.xml
URIResolver.resolve href="test2015122701.xml" base="file:/C:/Users/Martin%20Honnen/Documents/xslt/test2015122702.xsl"
Using parser com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser
Streaming test2015122701.xml : early exit


因此,Saxon实际上只处理文件的开头,然后在遇到第一个元素之后的格式不正确的标记之前退出。

关于xml - 从非常大的xml文件中提取第一个k子级的简单方法(可能已损坏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34480763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com