试图理解为什么简单的 jsonix 解组失败

Trying to understand why simple jsonix unmarshalling is failing

我是 jsonix 的新手,主要对使用它解组 xml 数据感兴趣。我写了一个非常基本的测试示例,但未能成功。

var MyModule = {
    name: 'MyModule',
    typeInfos: [{
        type: 'classInfo',
        localName: 'AnyElementType',
        propertyInfos: [{
            type: 'anyElement',
            allowDom: true,
            allowTypedObject:true,
            name: 'any',
            collection: false
        }]
    }],
    elementInfos: [{
        elementName: 'sos:Capabilities',
        typeInfo: 'MyModule.AnyElementType'
    }]
  };

  var context = new Jsonix.Context([MyModule], {namespacePrefixes:  {'http://www.opengis.net/sos/2.0':'sos'}});
  var unmarshaller = context.createUnmarshaller();
  var data = unmarshaller.unmarshalString('<sos:Capabilities version=\"2.0.0\">hello</sos:Capabilities>');
  return data;

我硬编码了一个简单的元素,该元素具有命名空间并包含用于测试 xml 的 'hello'。我对用于通用解组的 'any element mapping' 很感兴趣。我觉得在创建上下文时我已经正确配置了命名空间等,但我不断收到以下错误: 元素 [sos:Capabilities] 无法解组,因为在此上下文中未知,并且 属性 不允许 DOM 内容。想法?提前致谢。

免责声明:我是Jsonix的作者。

这里有两个问题。

首先,您的 XML 中缺少 xmlns:sos="http://www.opengis.net/sos/2.0"

其次,目前您需要将元素名称定义为具有 namespaceURIlocalPart 的对象。如果你只是使用字符串,Jsonix 将使用 defaultElementNamespaceURI(此处未定义)。 namespacePrefixes 选项当前未在 elementInfos 中应用。这将是一个很好的功能,如果你想要这个,请file an issue

这是一个 working JSFiddle 模块。

var MyModule = {
  name: 'MyModule',
  typeInfos: [{
    type: 'classInfo',
    localName: 'AnyElementType',
    propertyInfos: [{
      type: 'anyElement',
      allowDom: true,
      allowTypedObject: true,
      name: 'any',
      collection: false
    }]
  }],
  elementInfos: [{
    elementName: {
      namespaceURI: 'http://www.opengis.net/sos/2.0',
      localPart: 'Capabilities'
    },
    // 'sos:Capabilities',
    typeInfo: 'MyModule.AnyElementType'
  }]
};

var context = new Jsonix.Context([MyModule], {
  namespacePrefixes: {
    'http://www.opengis.net/sos/2.0': 'sos'
  }
});
var unmarshaller = context.createUnmarshaller();
var data = unmarshaller.unmarshalString('<sos:Capabilities version=\"2.0.0\" xmlns:sos=\"http://www.opengis.net/sos/2.0\">hello</sos:Capabilities>');
console.log(data);