遵循原則:元數據(有關數據的數據)應當存儲為屬性,而數據本身應當存儲為元素。
XML與操作系統無關,與編程語言無關,可以實現不同系統之間的數據交換
XML文檔內容由一系列標簽元素組成
<標簽名 屬性名="屬性值"></標簽名>
<元素名 屬性名="屬性值">元素內容</元素名>
---屬性值中不能直接包含<、“、&(不建議 '、>)
所有XML元素都必須由結束標簽,大小寫敏感,正確的嵌套
XML 數據以純文本格式進行存儲,因此提供了一種獨立於軟件和硬件的數據存儲方法。
XML 數據以文本格式存儲。這使得 XML 在不損失數據的情況下,更容易擴展或升級到新的操作系統、新應用程序或新的瀏覽器
如果信息感覺起來很像數據,那么請使用子元素。
避免 XML 屬性?
因使用屬性而引起的一些問題:
屬性無法包含多重的值(元素可以)
屬性無法描述樹結構(元素可以)
屬性不易擴展(為未來的變化)
屬性難以閱讀和維護
請盡量使用元素來描述數據。而僅僅使用屬性來提供與數據無關的信息。
元數據(有關數據的數據)應當存儲為屬性,而數據本身應當存儲為元素。
XML 屬性必須加引號
子元素可以重名!
通過 DTD 驗證的 XML 是“合法”的 XML。
DOM
——文檔對象模型,document object module 9
——節點:XML當中所有的內容都可以稱為節點node
——元素節點:#element,就是xml當中的標簽 1
——屬性節點:#Attribute,有值的(value) 2
——文本節點:#text,有值的(value)
——注釋節點:
**CDATA正常節點方式讀
應用領域:數據交互、 配置應用程序和網站、 Ajax基石
解析技術:
JDK:操作節點方便,讀寫繁瑣
---三方jar包
SAX:操作節點繁瑣,讀寫方便
DOM4J:操作、讀寫方便;性能高!!非web工程的情況:
桌面應用swing
第三方應用
一些功能單一的中轉站
導入dom4j的jar包,生成Referenced Libraries
獲取路徑的兩種方式:
//1.從src往后找,如果找不到返回null
pathString1 = ReadDemo.class.getClassLoader().getResource("demo.xml").getPath();//2.從src往后找,如果找不到返回null
String pathString1 = ReadDemo.class.getResource("/demo.xml").getPath();
讀取XML文檔
//開始解析
//1.獲取解析器
SAXReader reader = new SAXReader();
String pathString = ReadDemo.class.getClassLoader()
.getResource("book.xml").getPath();
System.out.println("book.xml path:"+pathString);
//2.獲取文檔
//reader.read(arg0)
Document document = reader.read(new FileInputStream(new File(pathString)));
System.out.print("document type:"+document.getNodeType()+"\t");
System.out.println(document.getNodeTypeName());
//3.獲取根目錄
Element rootEle = document.getRootElement();
System.out.print("rootEle type:"+rootEle.getNodeType()+"\t");
System.out.print(rootEle.getNodeTypeName()+"\t");
System.out.println(rootEle.getName());
//4.獲取子元素
rootEle.element("book");//根據節點名獲取第一個該名稱的節點
rootEle.elements();//獲取所有子標簽
rootEle.elements("book");//所有該名稱的子標簽//獲取屬性值以及子元素內容
List<Element>bookList = rootEle.elements("book");
for (Element book : bookList) {
Attribute attribute = book.attribute("id");
System.out.print("id attributes:"+attribute.getNodeType()+"\t");
System.out.print(attribute.getNodeTypeName()+"\t");
System.out.print(attribute.getName()+"\t");
System.out.println(attribute.getValue());
/*
* 方法2
* String idString = book.attributeValue("id"); System.out.println(idString);
*/
List<Element> bookChildEle = book.elements();
for (Element element : bookChildEle) {
System.out.print("bookChild element:"+element.getName()+"\t");
//System.out.println(element.getText()+"\t");//不去除空格的文本內容,多個空格為一個
System.out.println(element.getTextTrim());//去除空格的文本內容
}
}//寫文檔
Document document = DocumentHelper.createDocument();
Element books = document.addElement("books");
Element book = books.addElement("book");
Element book1 = books.addElement("book");//簡單添加元素
book.addAttribute("id", "bk001");
book.addCDATA("test word1");
book1.addAttribute("id", "bk002");
book1.addCDATA("test word2");//添加內容
newBookElement.setText("JVM 原理");
//格式化
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
//寫入文件
String pathString = ReadDemo.class.getResource("").getPath();
// System.out.println("當前路徑:"+pathString);
XMLWriter writer = new XMLWriter(new FileOutputStream(new File(pathString,"booksWrite.xml")), format);
writer.write(document);
writer.close();
System.out.println("success to write....");【注意:如果是使用eclipse等繼承開發工具查看,注意刷新當前文件夾,才能看到!】
XMLHttpRequest 對象用於在后台與服務器交換數據。
在 XML 中,省略關閉標簽是非法的。所有元素都必須有關閉標簽。
所有元素都必須彼此正確地嵌套
必須有一個元素是所有其他元素的父元素
XML 的屬性值須加引號。
【
如果屬性值本身包含雙引號,那么有必要使用單引號包圍它:
ex:
<gangster name='George "Shotgun" Ziegler'><gangster name="George "Shotgun" Ziegler">】
XML 文檔經常有一個對應的數據庫,其中的字段會對應 XML 文檔中的元素。有一個實用的經驗,即使用數據庫的名稱規則來命名 XML 文檔中的元素。
優勢:
1.XML 的優勢之一,就是可以經常在不中斷應用程序的情況進行擴展。
使用屬性而引起的一些問題:
- 屬性無法包含多重的值(元素可以)
- 屬性無法描述樹結構(元素可以)
- 屬性不易擴展(為未來的變化)
- 屬性難以閱讀和維護
請盡量使用元素來描述數據。而僅僅使用屬性來提供與數據無關的信息。
從src往后獲取路徑:
ClassName.getResource("/file.txt").getPath()
ClassName.getClassLoader().getResource("file.txt").getPath()