为什么没有明确指定的命名空间的XML属性不会被分配给默认命名空间

时间:2017-06-08 20:25:33

标签: java xml

我正在解析这个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>

我希望playerplayAttr位于http://www.example.com/default命名空间中,而coachcoachAttr位于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的处理方式不同?这是某种规格吗?它甚至意味着项目没有名称空间?

2 个答案:

答案 0 :(得分:1)

每个XML解析器的行为都是这样的。由于您的问题是“为什么”,我认为这对于大多数实际用途来说只是一种更简单的方法。

此处有更多详情:

https://stackoverflow.com/a/3313538/80911

答案 1 :(得分:1)

你究竟是什么意思“为什么?”。你的意思是“这个行为指定在哪里?”,或者“设计师为这个决定做出了什么理由?”或“这样做有什么好处?”

(顺便说一下,这些问题都不适合StackOverflow ......)

事实上,对此没有普遍的共识。 DOM和XPath以及大多数其他API都是这样做的,但XML命名空间规范本身没有强制要求,它说:

  

默认名称空间声明不直接应用于属性   名称;对无前缀属性的解释由   它们出现的元素。

我听过很多关于这应该是什么意思的理论,但这些理论都没有特别好地转化为具体的API。

在实践中,您需要查看您正在使用的API的规范,在本例中为DOM。 (StackOverflow上99%的Java / XML用户似乎都使用DOM,我觉得非常令人沮丧,因为有更好的替代方案,例如JDOM2和XOM。)