如何合并多个XML,不包括Rails中的重复内容?

时间:2017-01-17 13:19:57

标签: ruby-on-rails ruby xml nokogiri

我有三个XML文件,如下所示:

<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default ContentType="application/xml" Extension="xml"/>
<Default ContentType="image/png" Extension="png"/>
<Default ContentType="application/vnd.openxmlformats-package.relationships+xml" Extension="rels"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml" PartName="/word/settings.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml" PartName="/word/styles.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml" PartName="/word/footer1.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml" PartName="/word/fontTable.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml" PartName="/word/numbering.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" PartName="/word/document.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml" PartName="/word/header1.xml"/>
</Types>


<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default ContentType="application/xml" Extension="xml"/>
<Default ContentType="application/vnd.openxmlformats-package.relationships+xml" Extension="rels"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml" PartName="/word/settings.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml" PartName="/word/styles.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml" PartName="/word/fontTable.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml" PartName="/word/numbering.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" PartName="/word/document.xml"/>
</Types>

<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default ContentType="image/jpeg" Extension="jpg"/>
<Default ContentType="application/xml" Extension="xml"/>
<Default ContentType="image/png" Extension="png"/>
<Default ContentType="application/vnd.openxmlformats-package.relationships+xml" Extension="rels"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml" PartName="/word/settings.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml" PartName="/word/styles.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml" PartName="/word/fontTable.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml" PartName="/word/numbering.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" PartName="/word/document.xml"/>
</Types>

我想在不重复内容的情况下合并它们,以便最终结果看起来像这样:

<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default ContentType="application/xml" Extension="xml"/>
<Default ContentType="image/png" Extension="png"/>
<Default ContentType="image/jpeg" Extension="jpg"/>
<Default ContentType="application/vnd.openxmlformats-package.relationships+xml" Extension="rels"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml" PartName="/word/settings.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml" PartName="/word/styles.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml" PartName="/word/footer1.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml" PartName="/word/fontTable.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml" PartName="/word/numbering.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" PartName="/word/document.xml"/>
<Override ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml" PartName="/word/header1.xml"/>
</Types>

我正在使用Nokogiri,但直到现在我才能找到如何向XML添加新节点。我也想检查一下是否有重复。关于如何做到这一点的任何想法?

当我尝试将其转换为哈希然后将其转换回XML时,属性以单独的标记的形式返回。合并哈希值然后将最终哈希值转换回XML将不会以相同的格式生成输出。

如果我使用以下方法将第一个XML转换为哈希并返回XML:

h = Hash.from_xml(xml_string.gsub("\n", "")) 
h.to_xml

返回此结果:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<hash>
  <Types>
    <xmlns>http://schemas.openxmlformats.org/package/2006/content-types</xmlns>
    <Default type=\"array\">
      <Default>
        <ContentType>application/xml</ContentType>
        <Extension>xml</Extension>
      </Default>
      <Default>
        <ContentType>image/png</ContentType>
        <Extension>png</Extension>
      </Default>
      <Default>
        <ContentType>application/vnd.openxmlformats-package.relationships+xml</ContentType>
        <Extension>rels</Extension>
      </Default>
    </Default>
    <Override type=\"array\">
      <Override>
        <ContentType>application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml</ContentType>
        <PartName>/word/settings.xml</PartName>
      </Override>
      <Override>
        <ContentType>application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml</ContentType>
        <PartName>/word/styles.xml</PartName>
      </Override>
      <Override>
        <ContentType>application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml</ContentType>
        <PartName>/word/footer1.xml</PartName>
      </Override>
      <Override>
        <ContentType>application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml</ContentType>
        <PartName>/word/fontTable.xml</PartName>
      </Override>
      <Override>
        <ContentType>application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml</ContentType>
        <PartName>/word/numbering.xml</PartName>
      </Override>
      <Override>
        <ContentType>application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml</ContentType>
        <PartName>/word/document.xml</PartName>
      </Override>
      <Override>
        <ContentType>application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml</ContentType>
        <PartName>/word/header1.xml</PartName>
      </Override>
    </Override>
  </Types>
</hash>

0 个答案:

没有答案