当根节点有命名空间声明时,GXT 和 AutoBeans 能否处理 XML?

Posted

技术标签:

【中文标题】当根节点有命名空间声明时,GXT 和 AutoBeans 能否处理 XML?【英文标题】:Can GXT and AutoBeans process XML when the root node has a namespace declaration? 【发布时间】:2012-11-16 14:37:35 【问题描述】:

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

【问题讨论】:

首先你是如何将 xml 解析为 AutoBeans 的?最后我看了一下,GWT 只支持 JSONAutoBeans。 GXT 有一个 XmlReader,它使用自定义的 Splittable 实现来处理 XML - 你正在使用它吗?或者有其他方法可以连接吗? 是的,我应该更具体一些并打错字——我的意思是 GXT。我正在尝试使用 XmlReader。编辑帖子... 很好 - 尝试回答传入... 【参考方案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 中用于表示“伪选择器”,因此如果查询语言直接支持这一点,则查询语言会有点模糊:字符串 foo:bar 可以意思是“名称为 foo 且匹配伪选择器 bar 的所有元素”,或“名称空间 foo 中名称为 bar 的所有元素”。

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

另一个注意事项:由于属性没有伪选择器,您可以选择它们 - @PropertyName("namespace:attrname") 将正确读出 &lt;element namespace:attrname="value"&gt; 中属性中的值。

【讨论】:

谢谢 - 我认为这是大部分答案,但 XmlReader 无法专门读取根节点。因此,如果根目录包含命名空间的声明,则 XmlReader 根本无法解析 XML。根据您的回答,我认为这可能是由于 GXT 查询引擎的实施?我不是试图在命名空间声明中获取值,而是解析整个 XML 消息。似乎 XmlReader 认为没有有效的 XML 可以解析,除非根节点只是一个元素(例如 ...)。 问题的根源在于 IE 没有 getElementsByTagNameNS 函数,加上 : 运算符在 DomQuery 语法中已经有意义,这与将其用于命名空间不兼容。读取带有命名空间的元素没有问题——这些就像未使用的属性——但是在 IE 中读取 ab:email/ab:name 子标签。如果 DomQuery 不支持伪选择器(:first:even:not(...) 等),它可以匹配命名空间。其他选择,正如我在论坛帖子中概述的那样,强制 xml 解析看起来更像 CSS,或者一个新的查询 impl。

以上是关于当根节点有命名空间声明时,GXT 和 AutoBeans 能否处理 XML?的主要内容,如果未能解决你的问题,请参考以下文章

命名空间中的类并使用模板类型作为返回类型时的全局范围友元运算符声明

在可视化映射器中将命名空间添加到根节点

JAXB 编组:更改应声明命名空间的元素

命名空间

如何声明对现有命名空间的引用,该命名空间可在运行时从 JavaScript 包中获得

kubernetes pod重新调度,部署到不同的命名空间后会在不同的节点上运行。