[英]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.