14

Using the Soap module in Nodejs (via loopback-connector-soap), I'm trying to convert json to xml for my soap request, but I have a few problems...

What it is:

<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>

What it should be:

<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>
  • Should be only one <ns:UserDefinedFields>
  • And should be <base:fieldValue> instead of <ns:fieldValue>

Any advice would be super helpful! Thanks!

The XML:

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

The 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>
...
Sarfaraz Khan
  • 2,048
  • 1
  • 12
  • 27
Geoffrey Burdett
  • 1,580
  • 1
  • 12
  • 23
  • Probably an issue with the library. Try creating an issue on the github page and/or use a different xml2json library. – Rahat Mahbub Jul 05 '15 at 20:51
  • It probably shouldn't be ``. What you call `The XML` looks like JSON. – Thomas Weller Jul 09 '15 at 14:39
  • Maybe you just confuse **prefixes** with **namespaces**. If the prefix `ns` in your XML is pointing to the same namespace as `base` in your XSD, everything is fine. The question does not contain enough information to judge about this. Please add the `xmlns:ns=` and `xmlns:base=` parts. – Thomas Weller Jul 09 '15 at 14:42

1 Answers1

1

To deal with the namespace, pass the ignoredNamespaces the soap.createClient options.

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

And then add the namespace manually. It's ugly, but it works.

To deal with multiple UserDefinedFields, it should look like this:

{
    . . .
    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
    }
    . . .
}

Or to put it more simply:

{
    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>
Geoffrey Burdett
  • 1,580
  • 1
  • 12
  • 23