C#小Tip:Xml操作简明手册 3
3)读取、查找
当你手头有一个xml文件后,可以使用XmlDocument.Load()方法将其加载进来以便处理,所以“读取”没有什么可说的。而“查找”操作往往涉及XPath,这里只是我认为的比较常用到的查找操作,XPath这玩意实在是很强大很暴力。
回头看示例文档xmlsample.xml,我们可能遇到这样的需求:
(A)查找歌曲“Hurt”的演唱者?
(B)查找流派为“R&B”的歌曲名称?
(C)查找发行年份在2004以前的歌曲的演唱者?
(D)倒数第二首歌的歌曲名称?
针对上述问题,你当然可以通过递归遍历各结点来查找,不过使用XPath将是更为高效的方案:
问题(A)
Code
XmlDocument doc = new XmlDocument();
doc.Load("xmlsample.xml");
//
XmlNodeList xnl = doc.SelectNodes("/music/song[@title='Hurt']/artist");
foreach (XmlNode n in xnl)
{
Console.WriteLine(n.InnerText);
}
(以“/”起始的路径必定是绝对路径,即从根元素起。而对属性的引用前面要加“@”)
问题(B)
Code
XmlDocument doc = new XmlDocument();
doc.Load("xmlsample.xml");
//
XmlNodeList xnl = doc.SelectNodes("/music/song[genre='R&B']");
foreach (XmlNode n in xnl)
{
if (n is XmlElement)
{
Console.WriteLine(((XmlElement)n).GetAttribute("title"));
}
}
(不同于对属性的引用,对子节点的引用不需要使用“@”)
问题(C)
Code
XmlDocument doc = new XmlDocument();
doc.Load("xmlsample.xml");
//
XmlNodeList xnl = doc.SelectNodes("/music/song[year<2004]/artist");
foreach (XmlNode n in xnl)
{
Console.WriteLine(n.InnerText);
}
(数值一样可以比较。)
问题(D)
Code
XmlDocument doc = new XmlDocument();
doc.Load("xmlsample.xml");
//
XmlNode n = doc.SelectSingleNode("/music/song[last()-1]");
if (n is XmlElement)
{
Console.WriteLine(((XmlElement)n).GetAttribute("title"));
}
(具有一系列的内置函数,如last()、po
相关文档:
<Language from="SQL" To="C#">
<Type from="bigint" To="long" />
<Type from="binary" To="object" />
<Type from="bit" To="bool" />
<Type from="char" To="string" />
<Type from="datetime" To="DateTime" ......
有人会问,DTD和Schema都是对XML文档的一种约束,为什么不就选其中之一,而又有Schema呢。因为DTD安全度太低了,也就是说它的约束定义能力不足,无法对XML实例文档做出更细致的语义限制。其实细心的人会发现,在DTD中,只有一个数据类型,就是PCDATA(用在元素中)和CDATA(用在属性中),在里面写日期也行,数字还行,字符 ......
C#
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("~/Config/User_yhlx_Jb.xml"));
DataView dv = ds.Tables[0].DefaultView;
//dv.RowFilter = "State=0";
this.DropDownList1.DataSource = dv;
this.DropDownList1.DataTextField = "text";
this ......
范例如下:
var xml:XML=
<body>
text1
<bar>barText1</bar>
& ......