在處理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);