天天看點

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);