我有一个反序列化的XML文档(一个对象包含数据)。现在我使用XSLT转换文件来创建一个新的XML文档。
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 :(得分:1)
您必须自己实现此功能 - 至少在您使用标准的内置.NET XSLT API时。
因为你想要的并不是一个复杂的练习(假设转换总是给你相同的根元素而你正在使用deserializer that supports merge那么它在错误处理中更多,而不是实际的代码),我必须假设一个问题是性能。直观地说,如果你希望XSLT作为你的语言进行转换,那么性能的唯一方法就是构建扩展 - 再一次是.NET的简单任务 - 但这会降低你的XSLT的可移植性。
更新(以解决您的评论):
(我不确定我理解为什么你想在转换之前创建目标对象。)
您可以尝试执行此操作:设置对XslTransform.Transform的调用以转换为Stream(正如我所说,您实现自己的“错觉” - 您希望API看起来的方式)。使用protobuf的Serializer.Merge从上面的流中传入XmlReader,并将预先存在的对象合并为两个(出于什么原因,不清楚)。应该使用xsd.exe生成预先存在的对象的类型 - 我想。
根据您提供的伪代码,您可以在没有合并步骤的情况下离开。只需返回您反序列化的对象(使用基于目标XML XSD的xsd.exe生成)从传递给Transform的流中返回,然后设置您想要的任何属性 - 同样的事情。
答案 1 :(得分:0)
我可能错了,但我不确定你能用XSLT做到这一点。最简单的方法可能是在转换后反序列化xslt的输出,或者直接在Java中编写转换以便能够访问对象。