2014-07-21 43 views
0

所以我有一些生成XML的遗留代码。问题在于它通过打开和关闭标签来操作,并将所有内容写入文件。是否可以添加属性作为元素?

startTag("race") 
endTag() 

将产生:

这是一切优秀和良好。除了关于种族的某些相关信息只能在endTag()时被推断出来。即endTime。我想要生成的XML将是:

<race startTime="123" endTime="456> 
</race> 

但我知道这是不可能的,没有重大的重写。我不感到激动。如果在XSLT转换中有相当于使用xsl:attribute的东西,那真是太棒了。在哪里我可以得到这样的一些XML:

<race startTime="123"> 
    <attribute name="endTime"> 
     456 
    </attribute> 
</race> 

这被认为是正确的格式。

这可能吗?请注意,我无法绕过属性要求,因为它必须符合我无法控制的架构。所以我需要一种方法来使其成为“适当”属性。

+0

不,没有那样的东西。它位于何处?即使有这样的事情,你仍然需要修改遗留代码来使用它。代码目前对endtime有什么作用? –

+0

什么都没有?我只需要修改调用打开和关闭标签的代码部分。不是实际的功能。它目前离开它们,这妨碍了正确的操作。 –

+0

它目前离开_什么?现在它产生了什么,以及你需要它产生什么? –

回答

1

如果有问题的元素是空的,那么它应该是'太难了。如果你的代码是Java中,你可以很容易地将其转换为使用XMLStreamWriter允许调用序列像

startElement() 
attribute() 
attribute() 
endElement() 

,并通过延迟输出处理这个“>”在开始标签的结束,直到它知道所有的属性已经到了。但是如果你想写出“无序”内容,所以元素内容在属性之前输出,那么你需要一种非常不同的方法。例如,您可以输出“属性”作为处理指令,然后使用XSLT执行后处理,将处理指令转换为包含元素上的属性。

+0

我使用的XML编写器都是自定义代码,无法避免。你已经看到了这个问题的核心,我需要“无序”地构建它。我认为你现在的处理指导建议是我最好的选择。谢谢。 –

0

通常的解决方案确实是重写你的代码。你们没有给我们足够的信息提供任何信息,以告诉你这将是多么容易或困难。通常的解决方案是将属性传递给写出起始标签的方法,或者延迟实际写出起始标签语法,直到您知道不会再添加任何属性(这就是典型的XSLT串行器工程,所以它可以处理<xsl:attribute>指令)。

或者您可以在内存中构建整个文档,以便您可以轻松地返回并重新编辑以前构建的树部分。

或者你可以通过其他方式解决这个问题。哪一个最有意义取决于你没有告诉我们关于你的代码试图做什么,它使用什么XML库等的所有那些东西。

相关问题