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

时间:2016-05-04 16:36:01

标签: jsonix

我是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”。我对通用解组的“任何元素映射”感兴趣。我觉得在创建上下文时我已经适当地配置了命名空间等但是我一直收到以下错误: 元素[sos:Capabilities]无法解组,因为在此上下文中未知,并且该属性不允许DOM内容。思考?并提前感谢。

1 个答案:

答案 0 :(得分:2)

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

这里有两个问题。

首先,您在XML中缺少 def traits_view(self): style_sheet = ''' QLineEdit { background: yellow } ''' return QtView( Item('object.name'), Item('object.age'), style_sheet=style_sheet)

其次,目前您需要将元素名称定义为具有xmlns:sos="http://www.opengis.net/sos/2.0"namespaceURI的对象。如果你只使用字符串,Jsonix将使用localPart(这里没有定义)。 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);