2015-06-24 2 views
14

Используя модуль Soap в Nodejs (через loopback-connector-soap), я пытаюсь преобразовать json в xml для моего запроса на мыло, но у меня есть несколько проблем ...soap on node анализирует json на xml неправильно

Что это:

<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> 
  • Должен быть только один <ns:UserDefinedFields>
  • И должно быть <base:fieldValue> вместо <ns:fieldValue>

Любой совет будет супер полезно! Благодаря!

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> 
... 
+0

Вероятно проблема с библиотекой. Попробуйте создать проблему на странице github и/или используйте другую библиотеку xml2json. –

+0

Вероятно, это не должно быть ''. То, что вы называете «XML», выглядит как JSON. –

+0

Возможно, вы просто путаете ** префиксы ** с ** пространствами имен **. Если префикс 'ns' в вашем XML указывает на то же пространство имен, что и' base' в вашем XSD, все в порядке. Вопрос не содержит достаточной информации, чтобы судить об этом. Добавьте элементы 'xmlns: ns =' и 'xmlns: base ='. –

ответ

1

Чтобы справиться с пространством имен, передайте ignoredNamespaces на 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> 
Смежные вопросы