0

我尝试使用 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。

4

1 回答 1

1

GXT 的 XmlReader 位于浏览器本身的内置 XML 解析器之上。它使用com.google.gwt.xml.XMLGWT 中的模块在所有浏览器中获得对 XML 节点的相对一致的访问,而不是构建自己的 XML 解析器。通过在浏览器中使用内置实现,GXT 可以访问本机解析器——事实证明,浏览器非常擅长解析 XML,因为它们整天都在做这些事情,加载网页。

然后,GXT 有自己的查询引擎来查找节点,使用 XPath 和 CSS3 组合的查询语言。这种混合是为了让它能够很好地在 html 本身中查找节点,以及在 xml 文档中查找节点。这被设计成一致的

但是,浏览器对命名空间的支持不一致(我在看你,IE),所以 GWT 中的 XML 模块不知道如何谈论命名空间,DomQuery 引擎也不知道。此外,:在 XML 中表示“命名空间”的运算符在 CSS 中用于表示“伪选择器”,因此如果直接支持该查询语言,则查询语言会有点模糊:字符串foo:bar可能表示“所有具有名称的元素foo匹配 psuedo-selector bar”,或“bar命名空间中具有名称的所有元素foo”。

问题就够了:解决方案是什么?目前,IE6/IE7/IE8 中的命名空间元素还没有一个好的方法——一方面是浏览器中的不一致,另一方面是 GXT 中缺乏丑陋的解决方法,这意味着您无法直接读出元素。对于所有其他浏览器,要选择类似 的元素namespace:eltname,只需使用@PropertyName("eltname").

另一个注意事项:由于属性没有伪选择器,您可以选择它们 -@PropertyName("namespace:attrname")将正确读取<element namespace:attrname="value">.

于 2012-11-16T17:29:47.243 回答