xml解析(删除父节点)

莫尔盖特

嗨,当我尝试过滤掉我的xml文档时,我被严重卡住了。这是内容的一些示例:

<sentence id="1" document_id="Perseus:text:1999.02.0029" >
    <primary>millermo</primary>
    <word id="1" />
    <word id="2" />
    <word id="3" />
    <word id="4" />
</sentence>


<sentence id="2" document_id="Perseus:text:1999.02.0029" >
    <primary>millermo</primary>
    <word id="1" />
    <word id="2" />
    <word id="3" />
    <word id="4" />
    <word id="5" />
    <word id="6" />
    <word id="7" />
    <word id="8" />
</sentence>

有很多句子(超过3000个),但我要做的就是编写一些代码(最好使用Java或python),这些代码将遍历我的xml文件,并删除所有具有5个以上单词ID的句子,换句话说,我将只剩下带有5个或更少单词ID的句子标签。谢谢。(只是要注意我的xml不是很好,我与node / tags / element / ids混在一起了。

我正在尝试此atm,但不确定:

import xml.etree.ElementTree as ET

tree = ET.parse('treebank.xml')
root = tree.getroot()
parent_map = dict((c, p) for p in tree.getiterator() for c in p)

iterator = list(root.getiterator('word id'))

for item in iterator:
  old = item.find('word id')
  text = old.text
  if 'id=16' in text:
      parent_map[item].remove(item)
      continue

tree.write('out.xml')
完美的

考虑一个不需要循环的XSLT解决方案。作为信息,XSLT是一种声明性的特殊目的语言,其原始设计目的是将XML文档转换为各种格式,样式和结构,以供最终使用。具体来说,身份转换按原样复制整个文档,并将空模板写入<word>位置大于5的所有节点。

XSLT脚本 (另存为.xsl或.xslt文件)

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

  <!-- Identity Transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="word[position() &gt; 5]"/>

</xsl:transform>

Python脚本

import os, sys
import lxml.etree as ET

# LOAD XML AND XSL
dom = ET.parse('C/Path/To/Input.xml')  
xslt = ET.parse('C/Path/To/XSLTscript.xsl')

# TRANSFORM XML
transform = ET.XSLT(xslt)
newdom = transform(dom)

# PRETTY PRINT OUTPUT
tree_out = ET.tostring(newdom, encoding='UTF-8', pretty_print=True,  xml_declaration=True)
print(tree_out.decode("utf-8"))

# SAVE TO FILE
xmlfile = open('Output.xml'),'wb')
xmlfile.write(tree_out)
xmlfile.close()

XSLT的优点在于它是可转移的,因为几乎所有通用语言都维护包括Java在内的XSLT处理器:

Java脚本

import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

public class Sentence {

    public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {

        String currentDir = new File("").getAbsolutePath();
        String xml = "C:/Path/To/Input.xml";
        String xsl = "C:/Path/To/XSLTScript.xsl";

        // Transformation
        TransformerFactory factory = TransformerFactory.newInstance();
        Source xslt = new StreamSource(new File(xsl));
        Transformer transformer = factory.newTransformer(xslt);

        Source text = new StreamSource(new File(xml));
        transformer.transform(text, new StreamResult(new File("C:/Path/To/Output.xml")));

   }

}

输出 (使用发布的内容)

<?xml version='1.0' encoding='UTF-8'?>
<root>
  <sentence id="1" document_id="Perseus:text:1999.02.0029">
    <primary>millermo</primary>
    <word id="1"/>
    <word id="2"/>
    <word id="3"/>
    <word id="4"/>
  </sentence>
  <sentence id="2" document_id="Perseus:text:1999.02.0029">
    <primary>millermo</primary>
    <word id="1"/>
    <word id="2"/>
    <word id="3"/>
    <word id="4"/>
    <word id="5"/>
  </sentence>
</root>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章