我有一个大的xml文件需要加载到具有预定义格式的列表中。它有很多这样的子元素:
<tag1>
<tag2>element 1</tag2>
<tag2>element 2</tag2>
<tag2>element 3</tag2>
...
</tag1>
我想将这些子元素组合成一个字符串,如下所示:
<tag1>
<tag2>element 1;element 2;element 3;...</tag2>
</tag1>
标签的实际路径更复杂。
由于子元素的数量通常非常大,我想预处理文件以简化列表转换过程。我尝试使用XQuery,但它非常慢(可能是因为我不知道如何优化它)。我认为使用XLST也非常有效,但我没有时间去研究如何做到这一点。
答案 0 :(得分:1)
以下是我解决问题的方法:
cat file | tr '\n' '±' | sed 's/<\/tag2>±<tag2>/;/g' | tr '±' '\n'
我用tr用我知道的文件中没有出现的字符替换所有的LF(±),然后搜索结束标记,然后是±后跟开始标记,并用“;”替换它。然后我再次使用tr来恢复LF。
通过将sed输出连接到另一个sed替换,您可以“平坦化”任意数量的标签,这正是我需要的,因为我有几个标签需要展平。这使我的文件中的行减少了95%,使得其余的解析变得非常简单。
答案 1 :(得分:0)
是的,XSLT可能会起作用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template name="extract-item" match="/">
<xsl:element name="tag1">
<xsl:element name="tag2">
<xsl:for-each select="//tag1">
<xsl:apply-templates select="tag2"/>
</xsl:for-each>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
使用lxml库进行转换的python脚本:
#!/usr/bin/python
import lxml.etree as ET
dom = ET.parse('C:\Path\To\XMLFile.xml')
xslt = ET.parse('C:\Path\To\XSLTFile.xsl')
transform = ET.XSLT(xslt)
newdom = transform(dom)
tree_out = ET.tostring(newdom, encoding='UTF-8', pretty_print=True)
print(tree_out)