xml解析(删除父节点)

2024-05-16 23:43:27 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,当我试图过滤掉我的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不是很好,我与nodes/tags/element/ids混淆了。在

我试着用这台自动取款机,但不确定:

^{pr2}$

Tags: 代码text文档id示例内容xml单词
2条回答

问题是word是一个标记,id是它的属性;不能同时将它们都传递给.find()。 另外,解析的结果是一个树,其中属性和文本的表示方式与在XML文件中不同。在

我假设您有一个根元素,它有<sentence>个元素作为子元素。 您必须查看每个<sentence>节点,计算其<word>元素,并根据需要删除句子。在

# We cannot iterate over a tree and modify it at the same time.
# Remember the nodes to remove later.
elements_to_kill = []

for sentence_node in root.getiterator('sentence'):
    if len(sentence_node.findall('word')) <= 5:
        elements_to_kill.append(sentence_node)

# Now it's safe to remove them
for node in elements_to_kill:
    root.remove(node)

# Serialize as file, etc

希望这有帮助。在

你似乎不了解ETree是如何工作的。请随意使用read the docs并在Python REPL中进行实验以获得理解。在

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

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脚本

^{pr2}$

XSLT的优点在于它是可传输的,因为实际上所有通用语言都维护XSLT处理器,包括Java:

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>

相关问题 更多 >