2013-03-13 110 views
1

我有一个反序列化的XML文档(一个对象包含数据)。现在我正在使用XSLT转换文件来创建一个新的XML文档。使用XSLT将XML对象转换为已有的XML对象使用C#

transform(myXmlSourceObject, XSLT, output); 

变量output现在是Stream,XmlWriter或String。它包含由XSLT定义的新xml结构。

但我想用我想要的目标xml对象替换output,我已经从目标xml的模式创建/反序列化了。这意味着我已经有了一个将成为转换目标的对象。没有新的Stream,XmlWriter或String。

TargetXml alreadyCreatedTargetXmlObject = new TargetXml(); 
transform(myXmlSourceObject, XSLT, alreadyCreatedTargetXmlObject); 

的一点是,我要填补alreadyCreatedTargetXmlObject其值从myXmlSourceObject也能够做到编辑字段,如以下

alreadyCreatedTargetXmlObject.name ="SomeNewName"; 
alreadyCreatedTargetXmlObject.location.x="50.78"; 

新的XML将用数据来填充,和我如果需要我想编辑值。

回答

0

我可能是错的,但我不确定你可以用XSLT做到这一点。最简单的方法可能是在转换后反序列化xslt的输出,或者直接在Java中编写转换以便能够访问您的对象。

+0

Eric,Gero说“C#”;).... – 2013-03-13 18:37:11

+0

是的。对我感到羞耻...... – 2013-03-14 15:14:20

1

您必须自己实现此功能 - 至少在您使用标准的内置.NET XSLT API时。

因为你想要的不是一个复杂的练习(假设转换总是给你相同的根元素,而你使用的是deserializer that supports merge,那么它更多的是错误处理而不是实际的代码),我必须假设这里担心的是性能。直观地说,如果您希望XSLT作为您的语言进行转换,唯一的解决方法就是构建扩展 - 这又是.NET上的一项简单任务 - 但这会降低XSLT的可移植性。

更新(解决您的评论):

(我不知道我理解你为什么要拥有改造之前创建的目标对象)

你可以试着这样做:集打电话XslTransform.Transform做你的转变成一个流(正如我所说的,你实现自己的“幻想” - 你希望你的API看起来的方式)。使用protobuf的Serializer.Merge从上面的流中传入一个XmlReader,并将您的预先存在的对象合并(出于何种原因,不清楚)。预先存在的对象的类型应该使用xsd.exe生成 - 我想。

根据您提供的伪代码,您可以在没有合并步骤的情况下离开。只需从传递给Transform的流中返回您反序列化的对象(使用基于目标XML XSD的xsd.exe生成),然后设置所需的任何属性 - 同样的事情。

+0

你能否详细说明你的答案?源xml将有大约100个标签/属性和目标xml约50-70个标签/属性。 xslt文件将在例如xml间谍。只需将标签从一个xml匹配到另一个。在转换之后,我想手动更改目标xml的5个标签。 – Gero 2013-03-13 23:48:08

+0

想象一下,我必须使用2个不同的源xml并创建一个新的xml文档。转换到新的XML后,我只想编辑/添加一些新的XML内的值。例如从另一个源获取一个日期并插入到新创建的xml中。也许我不应该转换成现有的新XML对象,但编辑新创建的流 – Gero 2013-03-15 12:03:34

+0

是的,这正是你应该做的。再次,您可以将'来自另一个源'的日期作为参数传递给您的转换(XSLT本身支持输入参数),因此除非修改生成的XML的逻辑已经实现并与别处的其他人保持/共享,否则不应该有为什么不能完全在XSLT中完成,考虑到您需要的输入XML数量以及输入参数...... – 2013-03-15 12:17:58