在C#中用到xml文档中的内容,根节点(root)和根节点的下一级节点(rootChilds)可以直接得到,
而rootChilds中有<<很多子节点,子节点中又有子节点,且层数不定>>,要找的其中一个字节点(xxxNode),有关xxxNode的name,attributes都已知道,有什么好方法找到这个xxxNode节点?
尖括号中为关键。
而rootChilds中有<<很多子节点,子节点中又有子节点,且层数不定>>,要找的其中一个字节点(xxxNode),有关xxxNode的name,attributes都已知道,有什么好方法找到这个xxxNode节点?
尖括号中为关键。
解决方案 »
- C# 提取单引号内的字符串
- 关于Winform的一个多线程问题
- [散分]考一个简单问题,如何在同一个命名空间里,声明两个同名类?
- 为什么没有con.open()还能操作数据库?
- 请教一个编程模式的问题,有一个窗体,被很多其他窗体调用,用什么方法可以在其他窗体中控制该窗体的壮态
- IE9突然碰到的(修改了图片源...)
- .net2005的问题,急需解决!
- 关于使用HttpWebResponse获取页面数据的问题?
- 软件学习上遇到懊恼的事!帮帮我打开心结~
- 如何关闭系统后台的进程?请思归等高手做答!如果有会的朋友,也可帮小弟一下!
- 我想让用户可以自己设定datagrid列的显示顺序,可以将某列提前和退后,请问怎么实现?
- 小菜提问:关于枚举
然后在这个nodes中循环查找他的attribute是不是符合规定,我一般用这种方式,不过应该有更好的方式,比如xpath,不过我对这方法了解很少,我遇到的问题一般也比较简单,所以就用这种糊弄的方法了.如果你是出于学习的目的,还是学学xpath吧,我现在是已经到了"只要能应付"就可以的状态了.
using System.IO;
using System.Xml;public class Sample
{
public static void Main()
{ XmlDocument doc = new XmlDocument();
doc.Load("booksort.xml"); //Create an XmlNamespaceManager for resolving namespaces.
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("bk", "urn:samples"); //Select and display the value of all the ISBN attributes.
XmlNodeList nodeList;
XmlElement root = doc.DocumentElement;
nodeList = root.SelectNodes("/bookstore/book/@bk:ISBN", nsmgr);
foreach (XmlNode isbn in nodeList){
Console.WriteLine(isbn.Value);
} }}
[C++]
#using <mscorlib.dll>
#using <System.Xml.dll>
using namespace System;
using namespace System::IO;
using namespace System::Xml;
using namespace System::Collections;int main()
{
XmlDocument* doc = new XmlDocument();
doc -> Load(S"booksort.xml"); // Create an XmlNamespaceManager for resolving namespaces.
XmlNamespaceManager* nsmgr = new XmlNamespaceManager(doc -> NameTable);
nsmgr -> AddNamespace(S"bk", S"urn:samples"); // Select and display the value of all the ISBN attributes.
XmlNodeList * nodeList;
XmlElement * root = doc -> DocumentElement;
nodeList = root -> SelectNodes(S"/bookstore/book/@bk:ISBN", nsmgr);
IEnumerator* myEnum = nodeList->GetEnumerator();
while (myEnum->MoveNext())
{
XmlNode* isbn = __try_cast<XmlNode*>(myEnum->Current);
Console::WriteLine(isbn -> Value);
}
}
该示例使用文件 booksort.xml 作为输入。
<?xml version="1.0"?>
<!-- A fragment of a book store inventory database -->
<bookstore xmlns:bk="urn:samples">
<book genre="novel" publicationdate="1997" bk:ISBN="1-861001-57-8">
<title>Pride And Prejudice</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>24.95</price>
</book>
<book genre="novel" publicationdate="1992" bk:ISBN="1-861002-30-1">
<title>The Handmaid's Tale</title>
<author>
<first-name>Margaret</first-name>
<last-name>Atwood</last-name>
</author>
<price>29.95</price>
</book>
<book genre="novel" publicationdate="1991" bk:ISBN="1-861001-57-6">
<title>Emma</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>19.95</price>
</book>
<book genre="novel" publicationdate="1982" bk:ISBN="1-861001-45-3">
<title>Sense and Sensibility</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>19.95</price>
</book>
</bookstore>
最常见的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= bjDoc.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
<?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文件为:Doc.xml
XmlDocument xdoc = new XmlDocument();
xdoc.Load(@"路径\Doc.xml");
//得到你Load进来的XML文件,将该文件设为_docxml
//......
// 查找节点
XmlNode xnode = _docxml.SelectSingleNode("descendant::xxxNode[@属性="属性的Value"]");
//属性包括:"id","type"等等对该节点的描述
我这里有一篇平常整理的文章,相信你看了,问题可以解决,我截取查询部分发给你:可把这篇文章给我吗?
=============================================================================谢谢各位。