2017-02-17 17 views
-1

Я пробовал разные решения для достижения этого. У меня есть следующий XML-структурусплит 4gb xml на основе тега

<fullListing> 
    <employeeList> 
     <employee> 
      <name>emp1</name> 
      <id>1</id> 
     </employee> 
     <employee> 
      <name>emp2</name> 
      <id>2</id> 
     </employee> 
     <employee> 
      <name>emp3</name> 
      <id>3</id> 
     </employee> 
    </employeeList> 
    <departmentList> 
     <department> 
      <name>dept1</name> 
      <id>1</id> 
     </department> 
     <department> 
      <name>dept2</name> 
      <id>2</id> 
     </department> 
     <department> 
      <name>dept3</name> 
      <id>3</id> 
     </department> 
    </departmentList> 
    <regionData> 
     <region> 
      <zip>123321</zip> 
      <abc>aa</abc> 
     </region> 
     <region> 
      <zip>223311</zip> 
      <abc>bb</abc> 
     </region> 
     <region> 
      <zip>112233</zip> 
      <abc>cc</abc> 
     </region> 
     <zipmapping> 
      <zip>111111</zip> 
      <regionId>1</regionId> 
     </zipmapping> 
     <zipmapping> 
      <zip>222222</zip> 
      <regionId>2</regionId> 
     </zipmapping> 
     <zipmapping> 
      <zip>333333</zip> 
      <regionId>3</regionId> 
     </zipmapping> 
     <zipmapping> 
      <zip>444444</zip> 
      <regionId>4</regionId> 
     </zipmapping> 
     <areaMapping> 
      <zip>121212</zip> 
      <regionId>12</regionId> 
     </areaMapping> 
       <areaMapping> 
      <zip>131313</zip> 
      <regionId>13</regionId> 
     </areaMapping> 
       <areaMapping> 
      <zip>141414</zip> 
      <regionId>14</regionId> 
     </areaMapping> 
    </regionData> 
</fullListing> 

теперь мне нужно эффективное решение для разделения выше XML на несколько небольших файлов

так, что мне нужно в конце концов:

<employeeList> --> emplist file 
<departmentList> --> deptlist file 

и так на.

любые предложения/идеи?

+0

Прошло много времени с тех пор, как я это сделал, но это так просто, как последовательность ' 'с использованием TransformerFactory, как в ответе на [Передача XML-файла (InputStream) в XSLT, чтобы избежать использования документа в XSLT javax.xml] (http://stackoverflow.com/a/26172836/6768037)? –

+0

Итак, для любого типа дочернего элемента корневого элемента вы хотите создать отдельный файл? –

ответ

1

Предполагая, что процессор XSLT 3.0, как Saxon 9.6 или 9.7 EE, который поддерживает streaming вы можете написать любой ребенок корневого элемента в отдельный файл, используя

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:mode streamable="yes"/> 

    <xsl:template match="/*/*"> 
     <xsl:result-document href="{local-name()}.xml"> 
      <xsl:copy-of select="."/> 
     </xsl:result-document> 
    </xsl:template> 

</xsl:stylesheet> 

Такой подход с использованием <xsl:result-document href="{local-name()}.xml"> будет работать только если нет дочерние элементы с тем же именем.

+0

Если есть несколько элементов с тем же именем, вы можете использовать 'href =" {local-name()} {position()}. Xml "' –

+1

@MichaelKay, да, это будет один из способов получить уникальные URI для файл результатов, но нумерация может быть немного нечетной ('foo1.xml',' bar2.xml', 'foo3.xml'), поэтому я бы предпочел настроить накопитель, который хранит карту с подсчетом по имени элемента, чтобы мы получим 'foo1.xml',' bar2.xml', 'foo2.xml' и т. д. –