【问题标题】:Parse an XML file Ubuntu [duplicate]解析 XML 文件 Ubuntu [重复]
【发布时间】:2015-04-30 10:12:12
【问题描述】:

我需要解析一个 XML 文件。我需要取时间码(开头和结尾)和与这个时间相关的句子。

XML 文件是这样的:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Trans SYSTEM "trans-14.dtd">
<Trans scribe="jj" audio_filename="01" version="1" version_date="150211">
 <Episode>
  <Section type="report" startTime="0" endTime="50.28281021118164">
   <Turn startTime="0" endTime="50.28281021118164">
    <Sync time="0"/>

    <Sync time="1.195"/>
    Something
    <Sync time="2.654"/>
    Something 2
    <Sync time="4.356"/>
    Something 3
    <Sync time="9.321"/>
    Something 4
    <Sync time="22.171"/>
    Something 5
    <Sync time="28.351"/>
    Something 6
    <Sync time="35.708"/>
    Something 7
    <Sync time="43.04"/>
    Something 8
   </Turn>
  </Section>
 </Episode>

而我需要得到这个最终结果:

0  1.195
1.195 2.654 Something
2.654 4.356 Something 2
4.356 9.321 Something 3
9.321 22.171 Something 4
22.171 28.351 Something 5
28.351 35.708 Something 6
35.708 43.04 Something 7
43.04 "endTime" Something 8

我正在使用 Ubuntu,有什么建议吗?用 bash 可以做到这一点吗?

谢谢!

【问题讨论】:

  • @Serv 这个副本的问题是它似乎实际上是在建议你自己编写一个解析器,我个人认为这是一个糟糕的主意。
  • 我同意汤姆的意见,链接为重复的答案因其新颖性而非质量而被高度评价。这实际上是一个非常糟糕的答案。

标签: xml bash parsing


【解决方案1】:

XSLT 助你一臂之力!使用样式表

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

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

  <xsl:template match="Sync">
    <xsl:value-of select="@time"/>
    <xsl:text> </xsl:text>
    <xsl:choose>
      <xsl:when test="following-sibling::Sync">
        <xsl:value-of select="following-sibling::Sync[1]/@time"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>"endTime"</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:text> </xsl:text>
    <xsl:value-of select="normalize-space(following-sibling::text()[1])"/>
    <xsl:text>&#xa;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

然后您选择的 XSLT 处理器将其应用于 XML 文件。例如,xsltproc:

xsltproc file.xsl file.xml

file.xsl 包含上述样式表,file.xml 是您的 XML 文件。

【讨论】:

  • following-sibling::Sync[1]/@time,您不需要身份模板。
  • @Tomalak 两者似乎都有效。让我检查一下规格。
  • 是的,但它不干净。 value-of 将给定的节点集转换为字符串,这种转换仅针对集合中的第一个节点进行。所以following-sibling::Sync/@time 选择多个节点,但&lt;xsl:value-of select="following-sibling::Sync/@time" /&gt; 打印第一个。我认为这是“偶然发生的”,因此是一个挥之不去的错误。
  • 我想这个机制有点神秘。然后,我将对底部的following-sibling::text() 执行相同的操作。谢谢!
  • 这与您说substring(//multiple-nodes, 1, 5) 时启动的机制相同 - 这将返回所选集的第一个节点的前 5 个字符。 XSLT 1.0 默默地做到了这一点,XSLT 2.0+ 将明确抱怨在预期单个节点时尝试使用多个项目的序列。
猜你喜欢
  • 2011-03-10
  • 2010-09-07
  • 2012-12-25
  • 1970-01-01
  • 2021-02-28
  • 2020-11-30
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多