xml - 如何在R中融合XML数据中特定类型的节点?

标签 xml r merge cpu-word paragraph

我有一本书的 XML 文件。主树有正文/页列/区域/段落/行/单词级别。但是,我对 Line 级别不感兴趣。有没有什么方法可以使用 XML 包或任何其他包来融合 Line 级别而不破坏 R 中的 Word 级别?转换后,主树将是Body/Pagecolumn/Region/Paragraph/Word

下面提供了 XML 数据的示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DjVuXML>
<DjVuXML>
<BODY>
<OBJECT data="file://localhost//book1.djvu" height="1650" type="image/x.djvu" usemap="book1.djvu" width="1275">
<PARAM name="PAGE" value="book1_001.djvu"/>
<PARAM name="DPI" value="300"/>
<HIDDENTEXT>
<PAGECOLUMN>
<REGION>
<PARAGRAPH>
<LINE>
<WORD coords="1,2,3,4,5">Title</WORD>
</LINE>
</PARAGRAPH>
</REGION>
</PAGECOLUMN>
<PAGECOLUMN>
<REGION>
<PARAGRAPH>
<LINE>
<WORD coords="30,564,90,545,559">This</WORD>
<WORD coords="97,559,109,545,559">is</WORD>
<WORD coords="115,564,162,545,559">a</WORD>
</LINE>
</PARAGRAPH>
<PARAGRAPH>
<LINE>
<WORD coords="30,589,80,570,584">First</WORD>
<WORD coords="88,584,115,570,584">line</WORD>
<WORD coords="123,584,146,574,584">is</WORD>
</LINE>
<LINE>
<WORD coords="30,614,90,598,609">Second</WORD>
<WORD coords="97,609,143,595,609">line</WORD>
<WORD coords="148,614,168,595,609">is</WORD>
</LINE>
<LINE>
<WORD coords="30,640,56,626,640">Third</WORD>
<WORD coords="63,640,95,626,640">line</WORD>
<WORD coords="101,640,128,626,640">is</WORD>
</LINE>
</PARAGRAPH>
</REGION>
</PAGECOLUMN>
</HIDDENTEXT>
</OBJECT>
<MAP name="book1.djvu"/>
</BODY>
</DjVuXML>

谢谢。

最佳答案

我喜欢简单的正则表达式解决方案,在这种情况下它们可能是正确的选择。一般来说,对于 XML,我们会使用 XSLT。这是一种用于转换 XML 的语言。有一个 R 包 Sxslt 可用于转换 XML。这个想法是定义 2 个模板:

  1. 第一个模板就是所谓的恒等变换。这会复制所有属性和节点。如果某个特定元素有更相关的模板,xslt 将使用该模板。
  2. 然后我们声明了一个与 LINE 更相关的模板。这没有任何作用。因此,对于除 LINE 之外的所有节点和属性,变换都会执行复制。

这是我的代码:

# install package if needed
# install.packages('Sxslt', repos = "http://www.omegahat.org/R")
require(Sxslt)
# define a transformation
sltTemp <- '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
 <xsl:template match="@* | node()">
   <xsl:copy>
     <xsl:apply-templates select="@* | node()"/>
   </xsl:copy>
</xsl:template>

<xsl:template match="LINE">
   <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>'

# assume your XML is text variable named xdata
# you can also work on a parsed file if you like
# xD <- xmlParse(xdata)
# xsltApplyStyleSheet(xD, sltTemp)
# gives same result

require(XML)
newxdata <- saveXML(xsltApplyStyleSheet(xdata, sltTemp))
xmlParse(newxdata)
<?xml version="1.0"?>
<DjVuXML>
  <BODY>
    <OBJECT data="file://localhost//book1.djvu" height="1650" type="image/x.djvu" usemap="book1.djvu" width="1275">
      <PARAM name="PAGE" value="book1_001.djvu"/>
      <PARAM name="DPI" value="300"/>
      <HIDDENTEXT>
        <PAGECOLUMN>
          <REGION>
            <PARAGRAPH>
              <WORD coords="1,2,3,4,5">Title</WORD>
            </PARAGRAPH>
          </REGION>
        </PAGECOLUMN>
        <PAGECOLUMN>
          <REGION>
            <PARAGRAPH>
              <WORD coords="30,290,65,276,290">This</WORD>
              <WORD coords="73,290,84,276,290">is</WORD>
              <WORD coords="92,290,100,280,290">a</WORD>
            </PARAGRAPH>
            <PARAGRAPH>
              <WORD coords="30,290,65,276,290">First</WORD>
              <WORD coords="73,290,84,276,290">line</WORD>
              <WORD coords="92,290,100,280,290">is</WORD>
              <WORD coords="30,290,65,276,290">Second</WORD>
              <WORD coords="73,290,84,276,290">line</WORD>
              <WORD coords="92,290,100,280,290">is</WORD>
              <WORD coords="30,290,65,276,290">Third</WORD>
              <WORD coords="73,290,84,276,290">line</WORD>
              <WORD coords="92,290,100,280,290">is</WORD>
            </PARAGRAPH>
          </REGION>
        </PAGECOLUMN>
      </HIDDENTEXT>
    </OBJECT>
    <MAP name="book1.djvu"/>
  </BODY>
</DjVuXML>

关于xml - 如何在R中融合XML数据中特定类型的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17432788/

相关文章:

java - 在 Android 中从 HTTP 检索 XML/流的最佳实践

android - Eclipse Android : Error executing aapt: Return code 138, 我什么都没做似乎可以修复它

R可视化: sensible repel points on map (beeswarm?)

Git - 将非git文件夹与git下的类似文件夹 merge

python - 将列值与行值匹配并写入新列

xml - Elixir 和 Erlang 记录模式匹配

javascript - 如何在 javascript 中为默认命名空间中的 XML 节点分配前缀?

c++ - 使用 MatrixXf 的 Rcpp 特征映射错误

r - 找到所有圆的交点

mercurial - 在 Mercurial 中将一个分支的选定修订 merge 到另一个分支