【问题标题】:How can all fields of a specific type in an XML document be removed?如何删除 XML 文档中特定类型的所有字段?
【发布时间】:2016-12-26 20:50:08
【问题描述】:

我有一个遵循这个结构的超大文档(>5,000 个这样的实例):

<Questions>
    <QuestionID>558013</QuestionID>
    <Question>All of the following materials are categorized as &lt;chr8220&gt;fine art&lt;chr8221&gt; EXCEPT</Question>
    <Answer1>textiles</Answer1>
    <Answer2>paintings</Answer2>
    <Answer3>drawings</Answer3>
    <Answer4>sculptures</Answer4>
    <Answer5>architecture</Answer5>
    <AnswerGuide>Textile is not included in the category of fine art. Traditionally, textiles have been categorized as craft art.</AnswerGuide>
    <TypeID>1</TypeID>
    <Source>6,1,3</Source>
    <Footnote />
    <CardTypeID>0</CardTypeID>
    <Year>2016</Year>
    <SubjectID>41</SubjectID>
    <QuesNumber>4</QuesNumber>
    <AuxNum>4</AuxNum>
    <RandList>43512</RandList>
    <ResourceTypeID>382</ResourceTypeID>
    <TreeKey>01/01/01/</TreeKey>
    <TestID>41901</TestID>
    <DiffShort>N</DiffShort>
    <CardType />
</Questions>

我不需要从 CardType 到 TypeID 的字段,这样可以更轻松地删除这些字段。目前,我只是使用 Notepad ++ 来编辑这个 XML,并且想不出一个简单的方法来删除所有这些字段及其内容。有可能这样做吗?理想情况下,它会将上述内容简化为:

<Questions>
    <QuestionID>558013</QuestionID>
    <Question>All of the following materials are categorized as &lt;chr8220&gt;fine art&lt;chr8221&gt; EXCEPT</Question>
    <Answer1>textiles</Answer1>
    <Answer2>paintings</Answer2>
    <Answer3>drawings</Answer3>
    <Answer4>sculptures</Answer4>
    <Answer5>architecture</Answer5>
    <AnswerGuide>Textile is not included in the category of fine art. Traditionally, textiles have been categorized as craft art.</AnswerGuide>
</Questions>

【问题讨论】:

  • 实现此目的的一种方法是使用正则表达式。您可以选择所需的部分,然后将其包装在 标记中以创建新的 XML 文件。适用于您的案例的一个有用的正则表达式(Python 兼容):(\d+)\n\s+(.+)\n\s+(\w+) Answer1>\n\s+(\w+)\n\s+(\w+)\n\s+(\w+)\n\ s+(\w+)\n\s+(.+)
  • 哦,不,@caped114!现代编程的一个事实规则(刻在石板上的某处)是不要运行 regex on X/HTML 文档,因为这些不是自然语言。

标签: xml notepad++


【解决方案1】:

考虑一下XSLT,这是一种声明性的专用语言,专门设计用于将 XML 文件转换为各种最终用途。以下是两种方法。另存为 .xsl 文件并将其应用于您的 .xml 文件。 XSL 文件是格式良好的 XML 文件,可以像任何其他 XML 一样进行解析。

保留所需节点 (仅保留名称中带有“问题”或“答案”的节点)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

   <!-- Questions template -->
   <xsl:template match="Questions">
     <xsl:copy>
      <xsl:copy-of select="*[contains(name(),'Question') or contains(name(),'Answer')]"/>
     </xsl:copy>
   </xsl:template>

</xsl:stylesheet>

删除不需要的节点 (删除名称中没有“问题”或“答案”的所有节点)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

   <!-- Empty template -->
   <xsl:template match="Questions/*[not(contains(name(),'Question')) and not(contains(name(),'Answer'))]"/>

</xsl:stylesheet>

如何运行 XSL 脚本?

Notepad++ 本身不是 XSLT 处理器,而只是一个编辑器。大多数通用语言在各种扩展或库中都带有 XSLT 1.0 处理器,包括 Java、C#、Perl、Python、PHP、VB 等等。此外,专用的executables(例如 Xalan 和 Saxon)可以运行更高级别的 2.0 和 3.0 类型的 XSLT 脚本。此外,Windows PowerShell 和 Unix Bash 等命令行解释器可以运行它们。甚至从终端运行的xsltproc 也预装在大多数 Linux/Mac OS 上。

警告

XSLT 往往是内存密集型处理,需要读取整个文档并在内存中进行维护。因此,它们适用于较小的文件,但不适用于大文件。但是,如果您有足够的 RAM 容量,大约是 XML 文档大小的 5 倍(粗略估计),那么您可能能够在适当的时间和资源量内处理此类 XSLT。当然,如果您将大文档拆分成更小的部分,XSLT 可以运行得更顺畅。

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2015-01-16
    • 2021-07-26
    • 1970-01-01
    • 2014-04-29
    相关资源
    最近更新 更多