Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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
使用XSLT将XML对象转换为使用C的现有XML对象#_Xml_Xslt_Xsd_Xml Serialization - Fatal编程技术网

使用XSLT将XML对象转换为使用C的现有XML对象#

使用XSLT将XML对象转换为使用C的现有XML对象#,xml,xslt,xsd,xml-serialization,Xml,Xslt,Xsd,Xml Serialization,我有一个反序列化的XML文档(对象包含数据)。现在,我使用XSLT转换文件创建一个新的XML文档 transform(myXmlSourceObject, XSLT, output); 变量output现在是流、XmlWriter或字符串。它包含XSLT定义的新xml结构 但是我想用所需的目标xml对象替换output,我已经从目标xml的模式中创建/反序列化了该对象。这意味着我已经有了一个对象,它将成为转换的目标。没有新的流、XmlWriter或字符串 TargetXml alreadyCr

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

transform(myXmlSourceObject, XSLT, output);
变量
output
现在是流、XmlWriter或字符串。它包含XSLT定义的新xml结构

但是我想用所需的目标xml对象替换
output
,我已经从目标xml的模式中创建/反序列化了该对象。这意味着我已经有了一个对象,它将成为转换的目标。没有新的流、XmlWriter或字符串

TargetXml alreadyCreatedTargetXmlObject = new TargetXml();
transform(myXmlSourceObject, XSLT, alreadyCreatedTargetXmlObject);
关键是我想用
myXmlSourceObject
中的值填充
alreadyCreatedTargetXmlObject
,但也可以像下面这样编辑字段

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

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

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

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

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

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

更新(针对您的评论):

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

您可以尝试这样做:设置一个调用来将您的转换为流(正如我所说的,您自己实现了“幻觉”——您希望API的外观)。使用protobuf的序列化程序。Merge从上面的流中传入一个XmlReader,然后使用您预先存在的对象合并这两个对象(原因不明)。我认为,预先存在的对象的类型应该是使用xsd.exe生成的


根据您提供的伪代码,您可以不使用合并步骤就可以离开。只需从传递给转换的流中返回反序列化的对象(使用基于目标XML xsd的xsd.exe生成),然后设置所需的任何属性,这是一样的。

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

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

更新(针对您的评论):

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

您可以尝试这样做:设置一个调用来将您的转换为流(正如我所说的,您自己实现了“幻觉”——您希望API的外观)。使用protobuf的序列化程序。Merge从上面的流中传入一个XmlReader,然后使用您预先存在的对象合并这两个对象(原因不明)。我认为,预先存在的对象的类型应该是使用xsd.exe生成的


根据您提供的伪代码,您可以不使用合并步骤就可以离开。只需从传递给转换的流中返回您反序列化的对象(使用基于目标XML xsd的xsd.exe生成),然后设置您想要的任何属性,这是一样的。

您能详细说明一下您的答案吗?源xml大约有100个标记/属性,目标xml大约有50-70个标记/属性。xslt文件将在xml spy中生成。只是将标记从一个xml匹配到另一个xml。在转换之后,我想自己手动更改目标xml的5个标记。想象一下,我必须使用2个不同的源xml并创建一个新的xml文档。转换成新xml后,我只想在新xml中编辑/添加一些值。e、 g.从另一个源获取一个日期并插入到新创建的xml中。也许我不应该转换成现有的新xml对象,而是编辑新创建的Stream是的,这正是您应该做的。同样,您可以将另一个源的日期作为参数传递到转换中(XSLT本身支持输入参数),因此除非修改生成的XML的逻辑已经在其他地方实现并维护/共享,考虑到所需的输入XML和输入参数,没有理由不能完全在XSLT中完成这项工作……请您详细说明一下您的答案好吗?源xml大约有100个标记/属性,目标xml大约有50-70个标记/属性。xslt文件将在xml spy中生成。只是将标记从一个xml匹配到另一个xml。在转换之后,我想自己手动更改目标xml的5个标记。想象一下,我必须使用2个不同的源xml并创建一个新的xml文档。转换成新xml后,我只想在新xml中编辑/添加一些值。e、 g.从中获得一次约会