XPath XML命名空间问题

时间:2014-05-17 08:15:25

标签: java xml xpath

我必须读取具有前缀但未定义名称空间的XML

例如

<department:employee xsi:schema="www.abcd.com abcd.xsd" >
<emp:name>
John
</emp:name>

</department:employee>

我在java中使用Xpath

是否可以创建动态命名空间并将其与文档对象

绑定

此致

1 个答案:

答案 0 :(得分:1)

如果您想使用DOM API来阅读输入,则必须先修复它。

正则表达式可以提供帮助。编写执行以下操作的函数:

  • 以文字形式阅读文件。确保使用正确的字符编码。
  • 正则表达式搜索"xmlns:([^\\s:]+)="以查找所有已声明的前缀,并将其存储在地图中。
  • 正则表达式搜索"<([^\\s:]+):"以查找所有使用的名称空间前缀。
  • 确定使用但未声明的前缀:对于每个使用过的前缀,查找它是否在Map中。
  • 对于每个剩余的前缀,请用

    替换文档中的第一个"[^\\s?-]>"
    " xmlns:" + prefix + "='http://tempuri.org/" + prefix + "'$0"
    
  • 尝试将结果字符串添加到DOM API中,然后返回文档。
  • department的名称空间URI现在应为http://tempuri.org/department等。

正则表达式是近似值。 XML名称空间前缀中允许的字符规则为a bit more complicated than that。所以[^\s:]+不是真正的交易,但对你的情况来说可能已经足够了。