XML檔案:XMLFile.xml
<?xml version="1.0" encoding="utf-8"?>
<smallfoolsRoot>
<poems>
<id>1</id>
<author>王維</author>
<title>竹裡館</title>
<content>獨坐幽篁裡,彈琴複長嘯。深林人不知,明月來相照。</content>
</poems>
<poems>
<id>3</id>
<author>李白</author>
<title>杜陵絕句</title>
<content>南登杜陵上,北望五陵間。秋水明落日,流光滅遠山</content>
</poems>
<poems>
</smallfoolsRoot>
//操作一:讀取整個XML檔案
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("XMLFile/XMLFile.xml"));
if (ds.Tables.Count > 0)
{
this.Repeater1.DataSource = ds.Tables[0].DefaultView;
this.Repeater1.DataBind();
}
//操作二:獲得單個節點的值
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("XMLFile/XMLFile.xml"));
XmlNodeList xmlNodeList = xmlDoc.SelectNodes("smallfoolsRoot/poems[id='" + Request.QueryString["Xid"].ToString() + "']");//尋找
XmlNode xmlNode = xmlNodeList.Item(0);
this.tbauthor.Text = xmlNode["author"].InnerText;
this.tbtitle.Text = xmlNode["title"].InnerText;
this.tbcontent.Text = xmlNode["content"].InnerText;
public string ReturnCount()
{
//返回最後的ID值並+1
string i = string.Empty;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("XMLFile/XMLFile.xml"));
XmlNode xmlNode = xmlDoc.DocumentElement.LastChild;
if (xmlNode != null)
{
i = Convert.ToString(Convert.ToUInt32(xmlNode["id"].InnerText) + 1);
}
return i;
}
//操作四:添加一個節點
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("XMLFile/XMLFile.xml"));
//建立一個新節點
XmlElement newElement = xmlDoc.CreateElement("poems");
//建立newElement下的節點
XmlElement elid = xmlDoc.CreateElement("id");
XmlElement elauthor = xmlDoc.CreateElement("author");
XmlElement eltitle = xmlDoc.CreateElement("title");
XmlElement elcontent = xmlDoc.CreateElement("content");
elid.InnerText = ReturnCount();
elauthor.InnerText = this.tbaddauthor.Text.Trim();
eltitle.InnerText = this.tbaddtitle.Text.Trim();
elcontent.InnerText = this.tbaddcontent.Text.Trim();
//將newElement下的節點加到newElement上
newElement.AppendChild(elid);
newElement.AppendChild(elauthor);
newElement.AppendChild(eltitle);
newElement.AppendChild(elcontent);
//將newElement加入到xml檔案中(加在最後一條記錄上)
xmlDoc.DocumentElement.AppendChild(newElement);
//如果要插到某條記錄之後也可以用(加在第一條記錄之後)
//xmlDoc.DocumentElement.InsertAfter(newElement,xmlDoc.DocumentElement.ChildNodes.Item(0));
//如果要插到某條記錄之前也可以用(加在第一條記錄之前)
//xmlDoc.DocumentElement.InsertBefore(newElement,xmlDoc.DocumentElement.ChildNodes.Item(0));
//存檔
xmlDoc.Save(Server.MapPath("XMLFile/XMLFile.xml"));
//操作五:刪除某個節點
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("XMLFile/XMLFile.xml"));
XmlNodeList xmlNodeList = xmlDoc.SelectNodes("smallfoolsRoot/poems[id='" + Request.QueryString["Xid"].ToString() + "']");//尋找
XmlNode xmlNode = xmlNodeList.Item(0);
xmlNode.ParentNode.RemoveChild(xmlNode);
xmlDoc.Save(Server.MapPath("XMLFile/XMLFile.xml"));
// 操作六:編輯某個節點
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("XMLFile/XMLFile.xml"));
//獲得節點列表
XmlNodeList xmlNodeList = xmlDoc.SelectNodes("smallfoolsRoot/poems[id='" + Request.QueryString["Xid"].ToString() + "']");//尋找
XmlNode xmlNode = xmlNodeList.Item(0);
xmlNode["author"].InnerText = this.tbauthor.Text;
xmlNode["title"].InnerText = this.tbtitle.Text;
xmlNode["content"].InnerText = this.tbcontent.Text;
xmlDoc.Save(Server.MapPath("XMLFile/XMLFile.xml"));
用法:
1.Server.MapPath("/") 應用程式根目錄所在的位置 如 C:\Inetpub\wwwroot\
2.Server.MapPath("./") 表示所在頁面的目前的目錄
註:等價於Server.MapPath("") 返回 Server.MapPath("")所在頁面的物理檔案路徑
3.Server.MapPath("../")表示上一級目錄
4.Server.MapPath("~/")表示當前應用級程式的目錄,如果是根目錄,就是根目錄,如果是虛擬目錄,就是虛擬目錄所在的位置 如:C:\Inetpub\wwwroot\Example\
註:等效於Server.MapPath("~")。
最常見的XML資料類型有:Element, Attribute,Comment, Text.
Element, 指形如<Name>Tom<Name>的節點。它可以包括:Element, Text, Comment, ProcessingInstruction, CDATA, and EntityReference.
Attribute, 指在<Employee id=”12345”>中的粗體部分。
Comment,指形如:<!-- my comment --> 的節點。
Text,指在<Name>Tom<Name>的粗體部分。
在XML中,可以用XmlNode對象來參照各種XML資料類型。
2.1 查詢已知絕對路徑的節點(集)
objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee”)
或者
objNodeList = objNode.SelectNodes(“/Company/Department/Employees/Employee”)
以上兩種方法可返回一個NodeList對象,如果要返回單個節點可使用SelectSingleNode方法,該方法如果查詢到一個或多個節點,返回第一個節點;如果沒有查詢的任何節點返回 Nothing
2.2 查詢已知相對路徑的節點(集)
可使用類似於檔案路徑的相對路徑的方式來查詢XML的資料
objNode = objDoc.SelectSingleNode(“Company/Department”)
objNodeList = objNode.SelectNodes(“../Department)
objNode = objNode.SelectNode(“Employees/Employee”)
2.3 查詢已知元素名的節點(集)
在使用不規則的層次文檔時,由於不知道中介層次的元素名,可使用//符號來越過中間的節點,查詢其子,孫或多層次下的其他所有元素。例如:
objNodeList = objDoc.SelectNodes(“Company//Employee”)
2.4 查詢屬性(attribute)節點
以上的各種方法都返回元素(element)節點(集),返回屬性(attribute),只需要採用相應的方法,在屬性名稱前加一個@符號即可,例如:
objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee/@id”)
objNodeList = objDoc.SelectNodes(“Company//@id”)
2.5 查詢Text節點
使用text()來擷取Text節點。
objNode = objDoc.SelectSingleNode(“Company/Department/Deparmt_Name/text()”)
2.6 查詢特定條件的節點
使用[]符號來查詢特定條件的節點。例如:
a. 返回id號為 10102的Employee節點
objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee[@id=’10102’]”)
b. 返回Name為Zhang Qi的Name 節點
objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee/Name[text()=’Zhang Qi’]”)
c. 返回部門含有職員22345的部門名稱節點
objNode = objDoc.SelectSingleNode("Company/Department[Employees/Employee/@id='22345']/Department_Name")
2.7 查詢多重模式的節點
使用 | 符號可以獲得多重模式的節點。例如:
objNodeList = objDoc.SelectNodes(“Company/Department/Department_Name | Company/Department/Manager”)
2.8 查詢任意子節點
使用*符號可以返回當前節點的所有子節點。
objNodeList = objDoc.SelectNodes(“Company/*/Manager)
或者
objNodeList = objNode.ChildNodes
4 參考資料
<?xml version="1.0" encoding="UTF-8"?>
<Company>
<Department id="101">
<Department_Name>Cai WuBu</Department_Name>
<Manager>Zhang Bin</Manager>
<Employees>
<Employee id="12345">
<Employee_ID>12345</Employee_ID>
<Name>Zhang Bin</Name>
<Gender>male</Gender>
</Employee>
<Employee id="10101">
<Employee_ID>10101</Employee_ID>
<Name>Zhang QI</Name>
<Gender>female</Gender>
</Employee>
<Employee id="10102">
<Employee_ID>10102</Employee_ID>
<Name>Zhang Xia</Name>
<Gender>male</Gender>
</Employee>
<Employee id="10201">
<Employee_ID>10201</Employee_ID>
<Name>ZhangChuang</Name>
<Gender>male</Gender>
</Employee>
<Employee id="10202">
<Employee_ID>10202</Employee_ID>
<Name>Zhang Jun</Name>
<Gender>male</Gender>
</Employee>
</Employees>
</Department>
<Department id="102">
<Department_Name>KaiFa Bu</Department_Name>
<Manager>Wang Bin</Manager>
<Employees>
<Employee id="22345">
<Employee_ID>22345</Employee_ID>
<Name>Wang Bin</Name>
<Gender>male</Gender>
</Employee>
<Employee id="20101">
<Employee_ID>20101</Employee_ID>
<Name>Wang QI</Name>
<Gender>female</Gender>
</Employee>
<Employee id="20102">
<Employee_ID>20102</Employee_ID>
<Name>Wang Xia</Name>
<Gender>male</Gender>
</Employee>
<Employee id="20201">
<Employee_ID>20201</Employee_ID>
<Name>Wang Chuang</Name>
<Gender>male</Gender>
</Employee>
<Employee id="20202">
<Employee_ID>20201</Employee_ID>
<Name>Wang Jun</Name>
<Gender>male</Gender>
</Employee>
</Employees>
</Department>
</Company>