2011-05-06 75 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