[英]concatenating sub-elements of XML using sed
我有一个很大的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还是很有效的,但是我没有时间去弄清楚该怎么做。
这是我解决问题的方法:
cat file | tr '\n' '±' | sed 's/<\/tag2>±<tag2>/;/g' | tr '±' '\n'
我用tr替换了所有LF,用一个我知道不会出现在文件中的字符(±)进行替换,然后搜索end标记,然后跟随±,再跟随start标记,并用“;”替换。 然后,我再次使用tr来还原LF。
通过将sed输出传递到另一个sed替代中,您可以“平展”任意数量的标签,这正是我需要的,因为我需要平整多个标签。 这使我文件中的行减少了95%,从而使其余的解析非常简单。
是的,可能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>
和python脚本一起使用lxml库进行转换:
#!/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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.