节点添加
xml我认为就是闭合节点的集合,那么对这个闭合节点的操作这段时间自己小小的耍耍了下将自己的体会记下,以方便以后的使用
按照我的惯性思维,添加节点的子节点,那么首先应该定位到该节点,selectsinglenode方法来定位,然后该节点应该会有createnode等方法来建立子节点;结果到最后才知道添加子节点应该是在整个xml文档的基础上建立即xmldocument.createnode或者createelement,一般常用的是createelement(应该是XmlElement类型)不过可以这样写XmlNode nel = myxml.CreateElement(name),建立一个节点后就把这个节点附加到父节点上面parentnode.appendchild(node)。添加节点的工作就完毕了
最常见的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。例如:
objNode = objNode.SelectSingleNode(“/Company/Department/Employees/Employee”)
If Not (objNode is Nothing) then
‘- Do process
End If
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
3 XML数据的编辑
3.1 增加一个元素的属性(attribute)节点
Dim objNodeAttr As XmlNode
objNodeAttr = objDoc.CreateAttribute(“id”, Nothing)
objNodeAttr.InnerXml = “101”
objNode.Attributes.Append(objNodeAttr)
3.2 删除一个元素的属性
objNode.Attributes.Remove(objNodeAttr)
3.3 增加一个子元素(Element)
Dim objNodeChild As XmlNode
objNodeChild = objDoc.CreateElement(Nothing, “ID”, Nothing)
objNodeChild.InnerXml = “101”
objNode.AppendChild(objNodeChild)
3.4 删除一个子元素
objNode.RemoveChild(objNodeChild)
3.5 替换一个子元素
objNOde.ReplaceChild(newChild,oldChild)
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>
今天又一次接触了操作xml文件,其间碰到了诸如保存设置,查询等问题,不过经过不断搜索网络总算解决了问题。特别是一个多条件查询xml节点的问题,解决方法倒是很简单。
Xml文件主要内容如下:
<config>
<acts>
<a a1=’2′></a>
<a a2=’3′></a>
<a a2=’4′></a>
</acts>
<acts aa=’0′>
<a a1=’2′></a>
<a a2=’3′></a>
<a a2=’4′></a>
</acts>
</config>
我碰到的问题就是当需要查询所有的a节点,限制条件是:acts节点aa属性值为0以及其a子结点a1属性值为空(其实就是没有a1这个属性)
我在使用selectnodes函数对于xpath的编写就遇到了这样的问题:a属性值为空该如何表示了?是a1= null?还是a1=‘’?最后还是在搜索网络的时候发现可以这样来表示某个节点的属性不存在即not(属性)
因此最后的查询语句应该是XmlDoc.SelectNodes(“Config/act[@aa=’0′]/a[not(@a1)] “);
希望这个能帮助到您。