我正在尝试使用GXT和AutoBeans解析XML消息。我的XML的根节点有一个名称空间声明,看起来AutoBean解析器无法读取XML。
我使用PropertyName规范设置了AutoBean对象图的根:
@PropertyName("record")
RecordObject getRecord();
但是当我的XML看起来像这样:
<record xmlnms:ab="http://anynamespace.com">
<ab:name>SampleName</ab:name>
<ab:email>sample@email.com</ab:email>
</record>
AutoBean似乎无法解码XML。如果名称空间声明不存在,则AutoBean可以找到根记录对象。是否有其他参数或我可以指定的东西告诉AutoBean只查看元素名称?
我尝试了什么
我试图解析出被剥离的命名空间并且它可以工作但是在我的实际用例中我无法删除命名空间声明。我还试图在@PropertyName
属性 - @PropertyName("record xmlnms:ab=\"http://anynamespace.com\"")
中指定命名空间 - 但这不起作用(我也没想到)。
修改
我正在使用GXT的XmlReader来尝试解析XML。
答案 0 :(得分:1)
GXT的XmlReader位于浏览器本身存在的XML解析器构建之上。它使用GWT中的com.google.gwt.xml.XML
模块来获得跨所有浏览器的XML节点的相对一致的访问,而不是构建自己的XML解析器。通过在浏览器中使用内置实现,GXT可以访问本机解析器 - 事实证明,浏览器非常擅长解析XML,因为这是他们整天所做的,加载网页。
然后,GXT有自己的查询引擎来查找使用XPath和CSS3组合的查询语言中的节点。这种混合使其能够很好地查找html本身中的节点,以及在xml文档中查找节点。这是为了保持一致
但是,浏览器对名称空间的支持不一致(我在看你,IE),因此GWT中的XML模块不知道如何讨论名称空间,而且DomQuery引擎也不是。另外,:
运算符(在XML中表示'命名空间')用于表示CSS中的“伪选择器”,因此如果直接支持它,查询语言会有点模糊:字符串{{1可以表示“名称为foo:bar
的所有元素与psuedo-selector foo
匹配”或“名称空间bar
中名称为bar
的所有元素”。
这个问题已经足够了:解决方案是什么?目前,IE6 / IE7 / IE8中的命名空间元素并不是很好 - 浏览器中的一部分不一致,而GXT中缺少一些丑陋的解决方法意味着你无法直接读出这些元素。对于所有其他浏览器,要选择foo
等元素,只需使用namespace:eltname
。
另一个注意事项:由于属性没有伪选择器,可以选择它们 - @PropertyName("eltname")
将正确读出{{1}属性中的值}}