2011-05-06 55 views
4

我可以使用什麼語言來組合多個XML文件。多個爲10個以上的文件。結合許多XML文件

PHP,java或什麼?

我試過使用XSLT,但我不知道是否需要像Saxon這樣的'處理器'。

該文件令人困惑,因爲我不知道從哪裏開始。

總而言之,我需要有人指點我正確的方向。

有人請幫忙。我一直在試圖弄清楚這幾天

<xml version="1.0"> 
<products> 
<price>Price List Here</price> 
<model>Model Number Here</model> 
</product> 
+0

好問題,+1。查看我的答案,獲得一個簡潔而又簡單的純XSLT解決方案。 :) – 2011-05-07 02:56:16

回答

2

您可以使用任何語言,允許您直接操縱xml。我建議用DOM而不是SAX找到一些東西。如果你使用SAX,你必須自己遍歷xml--這是我的經驗。 DOM允許您以更多的OOP方式對xml進行操作。

一些立即跳入腦海的東西將是xml「文檔」的包裝xml。

因此,像:

<documents> 
    <document> 
     <!-- Your xml here --> 
    </document> 
    <document> 
     <!-- Your xml here --> 
    </document> 
    <document> 
     <!-- Your xml here --> 
    </document> 
</documents> 

僞代碼將是: 創建文檔根目錄。 添加一個名爲documents的元素,將其用作根。 迭代每個xml文件。 爲每個文件創建一個名爲document的新元素。將該元素添加到父級。從文件加載xml。將該節點導入外部文檔。將導入的節點附加到文檔元素子集合中。

編輯 如這裏承諾的是更新的代碼進行了測試,我知道作品:

<?php 

    // Replace the strings below with the actual filenames, add or decrease as fit 
    $filenames = array(0 => "test.xml", 1 => "test2.xml", 2 => "test3.xml"); 

    $docList = new DOMDocument(); 

    $root = $docList->createElement('documents'); 
    $docList->appendChild($root); 

    foreach($filenames as $filename) { 

     $doc = new DOMDocument(); 
     $doc->load($filename); 

     $xmlString = $doc->saveXML($doc->documentElement); 

     $xpath = new DOMXPath($doc); 
     $query = "//product"; // this is the name of the ROOT element 

     $nodelist = $xpath->evaluate($query, $doc->documentElement); 

     if($nodelist->length > 0) { 

      $node = $docList->importNode($nodelist->item(0), true); 

      $xmldownload = $docList->createElement('document'); 
      $xmldownload->setAttribute("filename", $filename); 
      $xmldownload->appendChild($node); 

      $root->appendChild($xmldownload); 
     } 

    } 

    echo $docList->saveXML(); 
?> 
+0

感謝您的建議。但是這看起來像是很多手動工作。我每天都會自動下載這些XML文件,而且我不想編輯每個單獨的XML文件 – 2011-05-06 20:11:01

+1

@RPM我不是故意要編輯它們。看看我的僞代碼。如果你有一個下載它們的進程,那麼相同的進程可以將它們轉換爲上面的結構。這從來沒有打算成爲手動操作。至於剝離<?xml標籤,也可以通過代碼完成。 – SRM 2011-05-06 20:33:58

+0

如果碰巧你知道或已經通過PHP完成了這個工作,你可以點亮它。我可以爲您提供當前的XML結構(所有10個文件都遵循相同的結構) - 這聽起來應該非常簡單,但我一直在嘗試實現它。 – 2011-05-06 20:45:02

7

這可以在純XSLT容易實現:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pdoc1Url" select="'doc1.xml'"/> 
<xsl:param name="pdoc2Url" select="'doc2.xml'"/> 

<xsl:template match="/"> 
    <documents> 
    <xsl:copy-of select="document($pdoc1Url)"/> 
    <xsl:copy-of select="document($pdoc2Url)"/> 
    </documents> 
</xsl:template> 
</xsl:stylesheet> 

代碼以上涉及兩個XML文檔,但可以擴展爲處理任何事先知道的XML文檔。

說明

  1. 傳遞的URL爲XML文檔作爲全球/外部參數的轉變。

  2. 使用標準的XSLT功能document()的。

+0

謝謝你的幫助。現在,我只是在瀏覽器中執行這個文件嗎?請原諒我對XSLT缺乏理解 – 2011-05-07 03:17:15

+1

你應該說你需要在瀏覽器中執行轉換。這通常是在頁面加載或其他適當的事件中使用Javascript代碼完成的。另外,如果URL在本地文件系統中引用文件,那麼很可能不會授予文件的訪問權限,因爲任何嘗試這樣做的方式都會影響編程語言。至於如何將外部參數傳遞給轉換,對於不同的XSLT處理器來說這是不同的。必須閱讀他們正在使用的XSLT處理器的文檔,以瞭解應該如何傳遞外部參數。 – 2011-05-07 03:46:16