我正在解析这个XML文档:
<?xml version='1.0' encoding='UTF-8'?>
<team xmlns='http://www.example.com/default' xmlns:ns1='http://www.example.com/ns1'>
<ns1:coach ns1:coachAttr="ABC"/>
<player playerAttr="XYZ"/>
</team>
我希望player
和playAttr
位于http://www.example.com/default
命名空间中,而coach
和coachAttr
位于http://www.example.com/ns1
命名空间中
结果playerAttr
根本没有名称空间。这是代码:
String xml="...";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xml)));
Element team = doc.getDocumentElement();
Element player = (Element) team.getChildNodes().item(...);
Element coach = (Element) team.getChildNodes().item(...);
Attr playerAttr = (Attr) player.getAttributes().item(...);
Attr coachAttr = (Attr) coach.getAttributes().item(...);
System.out.println("coach: Name=" + coach.getLocalName() + " NS=" + coach.getNamespaceURI());
System.out.println("coachAttr: Name=" + coachAttr.getLocalName() + " NS=" + coachAttr.getNamespaceURI());
System.out.println("player: Name=" + player.getLocalName() + " NS=" + player.getNamespaceURI());
System.out.println("playerAttr: Name=" + playerAttr.getLocalName() + " NS=" + playerAttr.getNamespaceURI());
这打印出4行。前3个对我有意义。我不明白最后一行,其中NS为空。
coach: Name=coach NS=http://www.example.com/ns1
coachAttr: Name=coachAttr NS=http://www.example.com/ns1
player: Name=player NS=http://www.example.com/default
playerAttr: Name=playerAttr NS=null
为什么playerAttr
的处理方式不同?这是某种规格吗?它甚至意味着项目没有名称空间?
答案 0 :(得分:1)
每个XML解析器的行为都是这样的。由于您的问题是“为什么”,我认为这对于大多数实际用途来说只是一种更简单的方法。
此处有更多详情:
答案 1 :(得分:1)
你究竟是什么意思“为什么?”。你的意思是“这个行为指定在哪里?”,或者“设计师为这个决定做出了什么理由?”或“这样做有什么好处?”
(顺便说一下,这些问题都不适合StackOverflow ......)
事实上,对此没有普遍的共识。 DOM和XPath以及大多数其他API都是这样做的,但XML命名空间规范本身没有强制要求,它说:
默认名称空间声明不直接应用于属性 名称;对无前缀属性的解释由 它们出现的元素。
我听过很多关于这应该是什么意思的理论,但这些理论都没有特别好地转化为具体的API。
在实践中,您需要查看您正在使用的API的规范,在本例中为DOM。 (StackOverflow上99%的Java / XML用户似乎都使用DOM,我觉得非常令人沮丧,因为有更好的替代方案,例如JDOM2和XOM。)