【问题标题】:soap on node is parsing json to xml wrong节点上的肥皂将 json 解析为 xml 错误
【发布时间】:2015-09-11 03:16:43
【问题描述】:

使用 Nodejs 中的 Soap 模块(通过 loopback-connector-soap),我正在尝试将 json 转换为 xml 以用于我的 soap 请求,但我有一些问题......

它是什么:

<ns:UserDefinedFields>
    <ns:UserDefinedField>
        <ns:displayName>Campaign?</ns:displayName>
        <ns:fieldValue>Yes</ns:fieldValue>
    </ns:UserDefinedField>
</ns:UserDefinedFields>
<ns:UserDefinedFields>
    <ns:UserDefinedField>
        <ns:displayName>Anticipated Use</ns:displayName>
    <ns:fieldValue>6</ns:fieldValue>
</ns:UserDefinedField>

应该是什么:

<ns:UserDefinedFields>
    <ns:UserDefinedField>
        <base:displayName>Campaign?</base:displayName>
        <base:fieldValue>Yes</base:fieldValue>
    </ns:UserDefinedField>
    <ns:UserDefinedField>
        <base:displayName>Anticipated Use</base:displayName>
        <base:fieldValue>6</base:fieldValue>
    </ns:UserDefinedField>
</ns:UserDefinedFields>
  • 应该只有一个&lt;ns:UserDefinedFields&gt;
  • 应该是&lt;base:fieldValue&gt; 而不是&lt;ns:fieldValue&gt;

任何建议都会非常有帮助!谢谢!

XML:

{
    ...
    "UserDefinedFields": [
        {
            "displayName": "Campaign?",
            "fieldValue": "Yes"
        },
        {
            "displayName": "Anticipated Use",
            "fieldValue": 6
        }
    ]
    ...
}

XSD:

...
<xs:element name="UserDefinedFields" minOccurs="0">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="UserDefinedField" type="base:UserDefinedFieldType" minOccurs="0" maxOccurs="15"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
...

【问题讨论】:

  • 可能是库的问题。尝试在 github 页面上创建问题和/或使用不同的 xml2json 库。
  • 它可能不应该是&lt;base:displayName&gt;&lt;/ns:displayName&gt;。你所说的 The XML 看起来像 JSON。
  • 也许你只是混淆了 prefixes 和 namespaces。如果 XML 中的前缀 ns 指向与 XSD 中的 base 相同的命名空间,则一切正常。该问题不包含足够的信息来判断这一点。请添加xmlns:ns= 和xmlns:base= 部分。

标签: json node.js soap loopbackjs


【解决方案1】:

若要处理命名空间,请将被忽略的命名空间传递soap.createClient 选项。

{
    "ignoredNamespaces": {
        namespaces: ['ns']
    },
}

然后手动添加命名空间。这很丑陋,但它有效。

要处理多个UserDefinedFields,应该是这样的:

{
    . . .
    DomainRegistration['ns:UserDefinedFields']['ns:UserDefinedField'][0] : {
        "base:displayName": "Campaign?",
        "base:fieldValue": "Yes"
    },
    DomainRegistration['ns:UserDefinedFields']['ns:UserDefinedField'][1] : {
        "base:displayName": "Anticipated Use",
        "base:fieldValue": 6
    }
    . . .
}

或者更简单地说:

{
    ouside: {
        insideA: [
            'one',
            'two',
        ]
        insideB: [
            {'one':'ONE'},
            {'two':'TWO'}
        ]
    }
}

//will create:

<outside>
    <insideA>
        <one />
        <two />
    </insideA>
    <insideB>
        <one>ONE</one>
    </insideB>
    <insideB>
        <two>TWO</two>
    </insideB>
</outside>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多