Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我有一个100+;MB XML文件(SAN DTD/Schema)。XSLT将赢得';我没有。转换/解析的策略?_Xml_Xslt_Parsing - Fatal编程技术网

我有一个100+;MB XML文件(SAN DTD/Schema)。XSLT将赢得';我没有。转换/解析的策略?

我有一个100+;MB XML文件(SAN DTD/Schema)。XSLT将赢得';我没有。转换/解析的策略?,xml,xslt,parsing,Xml,Xslt,Parsing,这个XML文件包含去年全年的存档新闻。我被要求按故事类别将这些故事分类为新的XML文件 big_story_export.xml 变成 lifestyles.xml food.xml nascar.xml ……等等 我使用一次性python脚本完成了这项工作,然而,我最初尝试使用XSLT来完成这项工作。这导致了我的XPATH选择在床上拉屎时的挫败感。测试文件进行了完美的转换,但将大文件放在我的样式表上,结果……什么都没有 您推荐什么策略来确保这样的文件将通过XSLT运行?这是一个供应商交给我

这个XML文件包含去年全年的存档新闻。我被要求按故事类别将这些故事分类为新的XML文件

big_story_export.xml
变成

lifestyles.xml
food.xml
nascar.xml
……等等

我使用一次性python脚本完成了这项工作,然而,我最初尝试使用XSLT来完成这项工作。这导致了我的XPATH选择在床上拉屎时的挫败感。测试文件进行了完美的转换,但将大文件放在我的样式表上,结果……什么都没有

您推荐什么策略来确保这样的文件将通过XSLT运行?这是一个供应商交给我的,所以想象一下,在定义这个文件的结构时,我没有太多的杠杆作用

如果你们想要代码样本,我会把它们放在一起

如果有什么不同的话,我会对一些让XML+XSLT顺利工作的技巧感到满意


@斯克利夫兹

我使用python的libxml2和libxslt来处理这个问题。我现在正在研究xsltproc

对于这些一次性情况,它似乎是一个很好的工具。谢谢


@棘突薯蓣

它的形式很好,尽管(如前所述)我没有能力发现它的有效性

至于写模式,我喜欢这个想法

如果这是一次性的,那么我花在验证这一个文件上的时间将是不切实际的,尽管我预计必须从我们的供应商那里处理更多这样的文件


编写一个模式(并将其提交给供应商)对于像这样管理XMLFunk是一个很好的长期策略。谢谢

您使用的是什么语言/解析器?
对于大文件,我尝试使用Unix命令行工具。
它们通常比其他解决方案效率更高,而且不会在大文件上“浪费”


尝试使用
xsltproc

您使用的是什么语言/解析器?
对于大文件,我尝试使用Unix命令行工具。
它们通常比其他解决方案效率更高,而且不会在大文件上“浪费”


尝试使用
xsltproc

这听起来像是大型XML文件或XSLT处理器中的错误。有两件事你应该检查你的档案

  • 该文件是格式良好的XML吗?也就是说,所有标记和属性是否正确终止和匹配?XML处理器可以告诉您这一点
  • 文件是否包含有效的XML?为此,您需要一个模式和一个XML验证器(也可以做到这一点)。我建议您投入一些精力来编写文件的模式定义。这将大大简化您的调试,因为这样您就可以轻松地查明可能存在的问题的确切根源

  • 如果文件格式正确且有效,但XSLT处理器仍然拒绝提供预期的结果,则可以确定问题出在处理器上,您应该尝试另一个问题。

    这听起来像是大型XML文件或XSLT处理器中的错误。有两件事你应该检查你的档案

  • 该文件是格式良好的XML吗?也就是说,所有标记和属性是否正确终止和匹配?XML处理器可以告诉您这一点
  • 文件是否包含有效的XML?为此,您需要一个模式和一个XML验证器(也可以做到这一点)。我建议您投入一些精力来编写文件的模式定义。这将大大简化您的调试,因为这样您就可以轻松地查明可能存在的问题的确切根源

  • 如果文件格式正确且有效,但XSLT处理器仍然拒绝提供您期望的结果,您可以确定问题出在处理器上,您应该尝试另一个问题。

    我可以推荐Saxon XSLT处理器吗?我知道它可以处理大文件,只要给Java JVM足够的内存


    另一件事是,您的XSLT中可能有一些优化可以帮助您,但很难对这类事情做出笼统的陈述。

    我可以推荐Saxon XSLT处理器吗?我知道,如果您给Java JVM足够的内存,它可以处理大文件


    另一件事是,您的XSLT中可能有一些优化,这可能会有所帮助,但很难对类似的事情做出笼统的陈述。

    使用XSLT处理任意大的XML文档的问题是,XSLT处理从将输入文档解析到源代码树开始。此树被解析到内存中。这意味着您最终将遇到一个大到足以导致问题的输入文档,即使您使用的是像Saxon这样的健壮XSLT处理器,并且您有大量的虚拟内存。(它可能仍能工作,但速度会很慢。)

    不使用XSLT的另一个原因是您正在生成多个输出文档,这(根据您到目前为止所说的)意味着您正在对输入文档进行多次传递


    采用基于SAX的方法而不是使用XSLT可能会更好(取决于许多我不知道的关于您的情况的因素)。使用SAX处理器,您可能可以编写一个方法,使单个仅向前传递的文件通过源文档,并在执行时对其进行解析,并在遇到包含它们的元素时写入所有输出文档。

    使用XSLT处理任意大的XML文档的问题是XSLT处理从将输入文档解析到源树开始。此树被解析到内存中。这意味着您最终将遇到一个大到足以导致问题的输入文档,即使您使用的是像Saxon这样的健壮XSLT处理器,并且您有大量的虚拟内存。(它可能仍能工作,但速度会很慢。)

    不使用XSLT的另一个原因是,您正在生成多个输出文档,这(根据您到目前为止所说的)意味着您需要