实验的xml内容如下:
<?xml version="1.0" encoding="gb2312" ?>
<!--这只是一个简单的xml实验,用于测试dom和XPath-->
<Forms>
<Form name="A">
<Control name="txt1" bindingSource="bs1" fieldName="txt1"/>
<Control name="txt2" bindingSource="bs1" fieldName="txt2"/>
<Control name="txt3" bindingSource="bs1" fieldName="txt3"/>
<Control name="txt4" bindingSource="bs1" fieldName="txt4"/>
</Form>
<Form name="B">
<Control name="txt10" bindingSource="bs2" fieldName="txt10"/>
<Control name="txt11" bindingSource="bs2" fieldName="txt11"/>
<Control name="txt12" bindingSource="bs2" fieldName="txt12"/>
<Control name="txt13" bindingSource="bs3" fieldName="txt13"/>
</Form>
</Forms>
其实,我打算写一个关于控件的动态绑定的框架,我前公司一个窗口的控件数达几百个,尽管现在出来了,我也想拿这个需求来练一练手嘛。上面这个xml就是我的初步设想,很粗糙。
针对这个xml文件,我写了些试验代码,如:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("A.xml");
XmlElement ele1 = xmlDoc.DocumentElement;
XmlNodeList xmlList = ele1.SelectNodes(@"child::Form[@name='A']");
txt1.Text = string.Empty;
foreach (XmlNode xmlE in xmlList)
{
txt1.Text += xmlE.InnerXml+"\r\n";
}
这段代码能查到节点。事实上,我们写代码的时候很容易范错误,如写成以下几种形式:
一、XmlNodeList xmlList = ele1.SelectNodes(@"child::/Forms/Form[@name='A']");
二、XmlNodeList xmlList = ele1.SelectNodes(@"child::Forms/Form[@name='A']");
三、XmlNodeList xmlList = xmlDoc.SelectNodes(@"child::/Forms/Form[@name='A']");
事实上,这三种方法都是错误的,这是一个相对路径的问题。如果是以xmlDoc来查的话,应当写成这样:
XmlNodeList xmlList = xmlDoc.SelectNodes(@"child::Forms/Form[@name='A']");
总之,无论是谁查,都不能写成绝对路径,也就是说前面不加/。加了运行时就出错了。
XPath的好例子,点此处进入。XPath的语法、用法并不复杂,它的精华都在谓词、函数。它们的组合产生不可思议的效果。
评论