可擴展標記語言XML(淅淅瀝瀝的小雨)
XML簡述
XML用於描述數據,是當前處理結構化文檔信息的有力工具。與操作系統編程語言的開發平臺無關,可以實現不同系統之間的數據交互。
xml文件結構:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <people> 3 <Name>姓名</Name> 4 <Sex>性別</Sex> 5 </people>
代碼中第一行是XML聲明,它一般在XML文檔的第一行。它由兩個部分組成:
version:文檔符合XML1.0規範。
encoding:文檔字符編碼,默認為“UTF-8”。
<!--註釋-->為註釋語法。
XML語言有3個特點:
1.XML中的每對標記通常被稱為節點,他們是成對出現而且必須成對出現的,用來描述這個節點存儲的內容。在節點中存儲該節點的信息。
2.XML中用於描述數據的各個節點可以自由橫向擴展和縱向擴展,即可以向下擴展也可以向內擴展(嵌套)。
3.XML文件中的節點嚴格區分大小寫。例:<Name>名字</Name>和<name>名字</name>這兩個節點內容相同,但節點名稱不一樣,即是兩個節點。
在C#中操作XML文件
在C#中操作並解析XML文件分為6個步驟:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Xml; //1.引入命名空間 7 8 namespace Demo 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 XmlDocument doc = new XmlDocument(); //2.創建XML文件對象 15 doc.Load("Path.xml"); //3.從指定路徑讀取整個XML文件的結構 16 XmlNode nodes = doc.DocumentElement; //4.獲取XML文件的根節點 17 foreach (XmlNode node in nodes.ChildNodes) //5.遍歷根節點的子節點 18 { 19 string name = node["name"].InnerText; //6.獲取XML文件節點中的內容 20 string sex = node["sex"].InnerText; 21 Console.WriteLine("姓名:{0},性別:{1}", name, sex); 22 } 23 } 24 } 25 }
XmlDocument對象:
表示整個XML文檔,它使用Load方法將指定的XML文件讀入XmlDocument對象,Load方法的參數是XML文檔的路徑。
DocumentElement屬性用於獲取根節點。
XmlNode對象:
XmlNode對象表示一個XML中的節點。
ChildNodes屬性用來獲取指定節點的所有子節點。
Name屬性可以獲取當前節點的名稱。 例:<name>名字</name>獲取name。
Inner Text屬性用來獲取當前節點的值。 例:<name>名字</name>獲取名字。
Attributes屬性可以獲取當前節點的特性。 例:<name type="dog">名字</name> Attributes["type"]獲取dog。
註意:ChildNodes屬性表示當前節點的所有子節點,這裏的所有子節點表示的是當前子節點的集合。
XML解析
XML文件除了給開發者看,更多的情況使用程序讀取xml文件的內容。這叫做xml解析
XML解析方式(原理不同)
DOM解析
SAX解析
XML解析工具
DOM解析原理:
1)JAXP (oracle-Sun公司官方)
2)JDOM工具(非官方)
3)Dom4J工具(非官方)
三大框架(默認讀取xml的工具就是Dom4j)
.......
SAX解析原理:
1)Sax解析工具(oracle-sun公司官方
什麽是DOM解析
DOM解析原理:xml解析器一次性把整個xml文檔加載進內存,
然後在內存中構建一顆Document的對象樹,通過Document對象,
得到樹上的節點對象,通過節點對象訪問(操作)到xml文檔的內容。
Dom4j工具
非官方,不在jdk中。
使用步驟:
1)導入dom4j的核心包。 dom4j-1.6.1.jar
2)編寫Dom4j讀取xml文件代碼
* 示例
/**
* 第一個Dom4j讀取xml文檔的例子
* @author APPle
*
*/
public class Demo1 {
public static void main(String[] args) {
try {
//1.創建一個xml解析器對象
SAXReader reader = new SAXReader();
//2.讀取xml文檔,返回Document對象
Document doc = reader.read(new File("./src/contact.xml"));
System.out.println(doc);
} catch (DocumentException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
Domj4讀取xml文件
- 節點:
-
Iterator Element.nodeIterator(); //獲取當前標簽節點下的所有子節點
-
- 案列:
/** * 得到節點信息 */ @Test public void test1() throws Exception{ //1.讀取xml文檔,返回Document對象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //2.nodeIterator: 得到當前節點下的所有子節點對象(不包含孫以下的節點) Iterator<Node> it = doc.nodeIterator(); while(it.hasNext()){//判斷是否有下一個元素 Node node = it.next();//取出元素 //繼續取出其下面的子節點 //只有標簽節點才有子節點 //判斷當前節點是否是標簽節點 if(node instanceof Element){ Element elem = (Element)node; Iterator<Node> it2 = elem.nodeIterator(); while(it2.hasNext()){ Node n2 = it2.next(); System.out.println(n2.getName()); } } } }
-
案例2:得到xml所有節點(使用遞歸)
/** * 遍歷xml文檔的所有節點 * @throws Exception */ @Test public void test2() throws Exception{ //1.讀取xml文檔,返回Document對象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //得到根標簽 Element rooElem = doc.getRootElement(); getChildNodes(rooElem); } /** * 獲取 傳入的標簽下的所有子節點 * @param elem */ private void getChildNodes(Element elem){ System.out.println(elem.getName()); //得到子節點 Iterator<Node> it = elem.nodeIterator(); while(it.hasNext()){ Node node = it.next(); //1.判斷是否是標簽節點 if(node instanceof Element){ Element el = (Element)node; //遞歸 getChildNodes(el); } }; }
- 案列:
可擴展標記語言XML(淅淅瀝瀝的小雨)