天天看点

XML中的QName和Namespace的实例演示

在处理emf生成的xml文件时,遇到了如下xml片段:

<?xml version="1.0" encoding="UTF-8"?>

<root xmlns:xmi="http://www.omg.org/XMI">
  <node id="12345" xmi:id="54321"/>
</root>
      

node节点有id和xmi:id两个属性,用普通的的方法element.attributeValue("xmi:id"),得到的值有时是12345,有时却是54321,貌似是优先取第一个遇到的属性。

要想分别取得id和xmi:id的值,就要用到QName和Namespace的概念。

Namespace分为prefix和uri,prefix就是那个属性前缀xmi,url就是等号右边的http://www.omg.org/XMI。

例如上段xml中在root中定义了一个Namespace: xmlns:xmi="http://www.omg.org/XMI"。

Qname比普通节点多了一个前缀,这个前缀就是Namespace中的前缀。实际上QName就是说在一个指定命名空间下的属性。

综上,可以看出id和xmi:id是在不同命名空间下的属性,使用QName可以很容易进行他们的读写操作。下面以dom4j来演示他们的读写区别。

先来个写xml文件的:

Document document = DocumentHelper.createDocument();
Element root = document.addElement("root");
root.add(Namespace.get("xmi", "http://www.omg.org/XMI"));
Element ele = root.addElement("node");

// write id="12345"
QName qname = QName.get("id");
ele.addAttribute(qname, "12345");

// write xmi:id="54321"
qname = QName.get("id", root.getNamespaceForPrefix("xmi"));
ele.addAttribute(qname, "54321");
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter output = new XMLWriter(new FileOutputStream(new File(
					"c:/test.xml")), format);
output.write(document);
output.close();
           

读取xml和写类似:

// read id="12345"
QName qname1 = QName.get("id");
String id = ele.attributeValue(qname1);
System.out.println(id);

// read xmi:id="54321"
qname1 = QName.get("id", root.getNamespaceForPrefix("xmi"));
String xmi_id = ele.attributeValue(qname1);
System.out.println(xmi_id);