3

我想转换一个 xml 字符串(她自己使用外部工具从字节数组构造。

我的文档和我的输入字符串都是用相同的 xsd 创建pub.string:stringToBytespub.xml:xmlStringToXMLNode

这部分效果很好。

之后我会创建一个文档,称之为 Doc。我打电话pub.xml:xmlNodeToDocument。但返回的文档类型不正确。我的意思是所有数据都是正确的,名称正确,但是当我尝试将一些数据映射到另一个文档时,它永远不会起作用。

我知道不清楚,抱歉。所以,详细来说,我有一个简单的 xsd :

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:complexType name="EtdDaCisIUpdParty">
    <xs:sequence>
      <xs:element name="wUpdatetsMax">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:maxLength value="15"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="wTpsnEtendu" type="WTpsnEtendu"/>
      <xs:element name="wTpsnExt" type="WTpsnExt" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="WTpsnEtendu">
    <xs:sequence>
      <xs:element name="Id" type="xs:string"></xs:element>
      <xs:element name="Name" type="xs:string"></xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="WTpsnExt">
    <xs:sequence>
      <xs:element name="key" type="xs:string"></xs:element>
      <xs:element name="value" type="xs:string"></xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="EtdDaCisIUpdParty" type="EtdDaCisIUpdParty" />

</xs:schema>

以及符合此 xsd 的对应 xml 字符串:

<?xml version="1.0" encoding="utf-8"?>
<mstns:EtdDaCisIUpdParty  xmlns:mstns="http://tempuri.org/XMLSchema.xsd" >
    <mstns:wUpdatetsMax>40</mstns:wUpdatetsMax> 
    <mstns:wTpsnEtendu>
        <mstns:Id>13</mstns:Id>
        <mstns:Name>Test</mstns:Name>
    </mstns:wTpsnEtendu>
    <mstns:wTpsnExt>
        <mstns:key>1</mstns:key>
        <mstns:value>one</mstns:value>
    </mstns:wTpsnExt>
    <mstns:wTpsnExt>
        <mstns:key>2</mstns:key>
        <mstns:value>something</mstns:value>
    </mstns:wTpsnExt>
    <mstns:wTpsnExt>
        <mstns:key>3</mstns:key>
        <mstns:value>nothing</mstns:value>
    </mstns:wTpsnExt>
</mstns:EtdDaCisIUpdParty>

使用相同 xsd 生成的文档: 在此处输入图像描述

然后我有一个将 xml 字符串转换为文档的 Flow 服务

在此处输入图像描述

它似乎有效,但事实并非如此。如果我添加一个简单的地图,它永远不会被处理:

在此处输入图像描述

结果中的管道从不包含最后一个映射的值。使用调试模式后,我了解到生成的文档pub.xml:xmlStringToXMLNode与我的文档类型不同。

在此处输入图像描述

管道输出中的Id字符串丢失。

我的理解和我的例子有什么问题?

4

1 回答 1

3

您的问题的答案mstns:EtdDaCisIUpdParty在于您的第二个和第三个屏幕截图之间变量数据结构的细微差别:

您的第二个屏幕截图显示了根据您在声明变量时使用的文档参考的数据结构,这是结构的设计时视图(您期望数据结构看起来像什么):

- mstns:EtdDaCisIUpdParty
  - mstns:wUpdatetsMax
  - mstns:wTpsnEtendu
  - ...

与您的第三个屏幕截图相比,它显示了运行时的实际数据结构:

- mstns:EtdDaCisIUpdParty
  - @version
  - @encoding
  - mstns:EtdDaCisIUpdParty
     - mstns:wUpdatetsMax
     - mstns:wTpsnEtendu
     - ...

请注意运行时结构中的额外级别,它包含 XML 序言属性@version@encoding一个称为mstns:EtdDaCisIUpdParty表示 XML 文档根节点的子文档。

尽管您已将管道变量声明mstns:EtdDaCisUpdParty为文档引用,但在运行时这无关紧要并且没有效果。文档引用让 webMethods Designer 在 GUI 中向您显示您期望的数据结构,这使您在设计时更容易使用它。但是,文档引用不会在运行时强制执行。

在运行时,因为您已从顶层映射documentmstns:EtdDaCisUpdParty,所以它具有与 相同的结构document,这与您在设计时使用的文档引用不同。这就是为什么您的地图步骤不起作用的原因。该mstns:EtdDaCisIUpdParty/mstns:wTpsnEtendu/mstns:Id变量在运行时实际上并不存在于管道中,而是在结构中更深一层:mstns:EtdDaCisIUpdParty/mstns:EtdDaCisIUpdParty/mstns:wTpsnEtendu/mstns:Id.

您可以通过从结构中的下一级向下映射来修复您的 Flow 服务:document/mstns:EtdDaCisIUpdParty--> mstns:EtdDaCisIUpdParty,而不是document--> mstns:EtdDaCisIUpdParty

因为document它是一个动态结构(它的结构仅在运行时才知道,因为它依赖于它解析的 XML),您需要在调用的Service Out管道中手动创建一个称为mstns:EtdDaCisIUpdParty子级的 IData 文档,并且然后从中映射:documentpub.xml:xmlNodeToDocument

  1. documentService Out管道(不是右边的Pipeline Out )中右击,
  2. 插入一个新的 Document 变量
  3. 给它命名mstns:EtdDaCisIUpdParty
  4. mstns:EtdDaCisIUpdPartyService Out管道映射到Pipeline Outmstns:EtdDaCisIUpdParty中的变量。

另外,我建议您在对 的调用中设置以下输入参数pub.xml:xmlNodeToDocument,以便一致地解析所有 XML 文档:

  • 设置makeArrays为,false因为如果您为documentTypeName
  • 设置nsDecls/mstnshttp://tempuri.org/XMLSchema.xsd以便一致地解析所有 XML 文档,无论使用的名称空间前缀如何(前缀以外的前缀mstns仍将表示为名为 的字段mstns:fieldname;除非您在参数中声明名称空间,否则不会发生这种情况nsDecls
  • 设置documentTypeName为用于声明变量的文档引用,mstns:EtdDaCisIUpdParty以便一致地处理带有 a 的 XML 元素maxOccurs > 1(即使相关元素仅在 XML 中出现一次,也始终将其解析为数组)

并且为了防止您的服务被意外/不受支持的 XML 文档调用,您可能应该调用pub.schema:validate以确保 XML 格式正确并且对您上面提供的 XSD 或类似文件有效。

于 2015-07-25T08:34:43.920 回答