【问题标题】:transform XML object with XSLT to already existing XML object with C#使用 XSLT 将 XML 对象转换为使用 C# 的现有 XML 对象
【发布时间】:2013-03-13 12:20:40
【问题描述】:

我有一个反序列化的 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);

关键是我想用来自myXmlSourceObject 的值填充alreadyCreatedTargetXmlObject,但也能够编辑如下字段

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

新的 xml 将填充数据,如果需要,我想编辑值。

【问题讨论】:

    标签: xml xslt xsd xml-serialization


    【解决方案1】:

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

    由于您想要实现的不是复杂的练习(假设转换始终为您提供相同的根元素,并且您使用的是 deserializer that supports merge 那么它更多的是错误处理而不是实际代码),我有这里假设一个问题是性能。直观地说,如果您希望将 XSLT 作为您的语言进行转换,那么提高性能的唯一方法就是构建扩展——这在 .NET 上也是一项简单的任务——但这会降低 XSLT 的可移植性。

    更新(解决您的评论):

    (我不确定我是否理解您为什么要在转换之前创建目标对象。)

    您可以尝试这样做:设置对XslTransform.Transform 的调用以将您的转换为流(正如我所说,您实现了自己的“幻觉” - 您希望您的 API 看起来的方式)。使用 protobuf 的 Serializer.Merge 从上面的流中传入一个 XmlReader,以及您预先存在的对象来合并两者(出于什么原因,不清楚)。预先存在的对象的类型应该是使用 xsd.exe 生成的——我想。

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

    【讨论】:

    • 您能否详细说明您的答案?源 xml 将有大约 100 个标签/属性,目标 xml 大约有 50-70 个标签/属性。 xslt 文件将在例如生成xml 间谍。只是将标签从一个 xml 匹配到另一个。转换后我想自己手动更改目标xml的5个标签。
    • 想象一下,我必须使用 2 个不同的源 xml 并创建一个新的 xml 文档。在转换为新的 xml 之后,我只想在新的 xml 中编辑/添加一些值。例如从另一个来源获取一个日期并插入到新创建的 xml 中。也许我不应该转换成现有的新 xml 对象,而是编辑新创建的流
    • 是的,这正是你应该做的。同样,您可以将该日期 from another source 作为参数传递到您的转换中(XSLT 本身支持输入参数),因此除非修改您生成的 XML 的逻辑已经实现并与其他地方的其他人进行维护/共享,否则应该没有理由考虑到输入 XML 和输入参数一样多,无法在 XSLT 中完全做到这一点......
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多