您的位置:首页 > 编程语言 > C#

C# 读取xml中特定节点的属性值 xmldocument方式

2009-06-04 22:44 756 查看
http://www.cnblogs.com/kiddo/archive/2007/09/03/879932.html

2007-06-08 17:55

下面这个xml
文件,要找的路径是"WTTData"Component"ComponentData"ComponentData"ObjectQueryBuilder 找属性field为datastore的expression节点的value值.

<WTTData>

<Component SetName="Explorers"
GroupName="JobExplorer">

<ComponentData Name="JobExplorer"
Version="2.2.2098.0">

<ComponentData Name="HorzSplitter"
Version="2.2.2098.0">

<Data Position="185" />

</ComponentData>

<ComponentData Name="VertSplitter"
Version="2.2.2098.0">

<Data Position="150" />

</ComponentData>

<ComponentData
Name="TabbedObjectTreeControl" Version="2.2.2098.0"
Visible="True">

<Data SelectedTreeNodePath="$"
CurrentTab="0" />

</ComponentData>

<ComponentData Name="ConfigurableListControl"
Version="2.2.2098.0">

<Column Name="" Width="32"
SortIndex="0" SortOrder="None" ColumnOrder="0" Default="True"
/>

<Column Name="Id" Width="70" SortIndex="-1"
SortOrder="None" ColumnOrder="1" Default="True" />

<Column
Name="Name" Width="352" SortIndex="-1" SortOrder="None" ColumnOrder="2"
Default="True" />

<Column Name="AssignedToAlias" Width="80"
SortIndex="-1" SortOrder="None" ColumnOrder="3" Default="True"
/>

<Column Name="FullPath" Width="190" SortIndex="-1"
SortOrder="None" ColumnOrder="4" Default="True" />

<Column
Name="LastUpdatedTime" Width="150" SortIndex="1" SortOrder="Descending"
ColumnOrder="5" Default="True" />

</ComponentData>

<ComponentData Name="QueryBuilder"
Version="2.2.2098.0" Visible="True">

<ObjectQueryBuilder
ControlType="Microsoft.DistributedAutomation.UI.QueryBuilder"
ControlAssembly="Microsoft.WTT.UI.Controls.ObjectControls" Assembly="WTTOMJobs"
Type="Microsoft.DistributedAutomation.Jobs.Job" Title="Job
Query">

<Expression Index="1" Static="True" AttachWith=""
Mapping="DataStore" Field="DataStore" Operator="Equals" Value="WTTMobile1"
/>

<Expression AttachWith="And" Mapping="Id" Field="ID"
Operator="Greater" Value="733454" />

<Expression
AttachWith="And" Mapping="Id" Field="ID" Operator="Less" Value="733740"
/>

</ObjectQueryBuilder>

</ComponentData>

<ComponentData Name="ToolBar"
Version="2.2.2098.0">

<Data
DefinitionController="WTTMobile1" HideQueryBuilder="True" HideHierarchy="True"
MaxItemsToDisplay="500" />

</ComponentData>

</ComponentData>

</Component>

<ActiveComponent
SetName="Explorers" GroupName="JobExplorer" />

</WTTData>

实现代码是:

{

{

xDoc.Load(filename);

xElem1 = (

{

dataStoreString = xElem1.GetAttribute(

}

}

}

1,定义一个XmlDocument对象xDoc

2,通过XmlDocument来load需要读取的xml文件

3,通过XmlDocument的SelectSingleNode来找到节点,并把节点转换为XmlElement

4,XmlElement
可以对节点的属性进行操作

注意两点:

1,

其中xDoc.SelectSingleNode("descendant::Expression[@Field='DataStore']"
);
SelectSingleNode参数里带有过滤条件,匹配公式是

descendant::nodename[@attribute='attributevalue']

2,xElem1 = (XmlElement
)xDoc.SelectSingleNode("descendant::Expression[@Field='DataStore']"
);把XmlNode强制转为XmlElement,理由是XmlElement是XmlNode的子类,前者比后者提供更多好用的方法,比如属性的读和写.XmlNode除了可以转为XmlAttribute.

static
public
string
getDataStore(
string
filename)
string
dataStoreString =
string
.Empty;
if
(!
string
.IsNullOrEmpty(filename))
XmlDocument
xDoc =
new
XmlDocument
();
XmlElement
xElem1;
XmlElement
)xDoc.SelectSingleNode(
"descendant::Expression[@Field='DataStore']"
);
if
(xElem1 !=

null
)
"Value"
);
return
dataStoreString;
http://blog.163.com/my_shuba/blog/static/690095092008111852923671/
随手写了一个小程序,发现WebClient返回数据特别慢,不知道是网站的原因还是本身的
原因。正好同事也在使用,就手工造了近8W多条数据保存到数据库中,然后用Aspx页面读出,WebClient(WinForm)返回后用
XmlDocument读取后显示在窗口中的DataGrid中。测试过程中发现,20多分钟还没有显示出界面。本以为是数据量太大造成数据库读取数据和
用WebClient返回有问题,但跟踪一下,返回数据不过十秒,而系统停在了XmlDocument中的节点形成DataTable的地方。
由于 程序是测试用,所以就随手写了以下代码
for( int i = 0; i < root.ChildNodes.Count; i ++ )
{
for( int j = 0; j < root.ChildNodes[i].ChildNodes.Count; j ++ )
{
;数据转换
}
}
发现竟然这个循环就20多分钟还没有完,10秒钟也就循环500多次
引用有问题?修改
int count = root.ChildNodes[0].ChildNodes.Count ;//数量肯定是一致的
for( int i = 0; i < root.ChildNodes.Count; i ++ )
{
XmlNode _node = root.ChildNodes[i] ;
for( int j = 0; j <count; j ++ )
{
;数据转换
}
}
不行,没有用。
把内层循环中的处理去说,保留一个空循环,测试,速度果然提高了不少,10秒钟循环了12000多次。
慢着,怎么会越来越慢?后来连3000次都不到了。难道每次根据节点取索引都从头找吗?
换个思路吧。
int count = root.ChildNodes[0].ChildNodes.Count ;//数据肯定是一致的
XmlNode _node = root.ChildNodes[0] ;
for( int i = 0; i < root.ChildNodes.Count; i ++ )
{
for( int j = 0; j <count; j ++ )
{
;数据转换
}
_node = _node.NextSibling ;
}
再测试,FT,竟然5秒都不到就完成了近8W次的数据转换。
哭笑不得啊!
看了一下定义,XmlNode.ChildNodes的类型为XmlChildNodes,不怕,看一下索引实现吧:

public override XmlNode
Item(int
i){ if (XmlNode
node1 = this.container
.FirstChild
; while (NextSibling
; XmlNode
Item(int
index){ if (list
.Count
) { this.ReadUntil
(list
.Count
) && (XmlNode
) this.list
[index
]; } return null;}
private ArrayList list;

说不上是它弱还是我弱,反正歪打正着,要不和真不知道效率是差在这个地方。平时用SelectNodes比较多,也从来没有做过这么大一个XmlDocument。
http://support.microsoft.com/kb/308333/zh-cn
本文演示如何使用 XPathNavigator
类通过 XML 路径语言 (XPath) 表达式查询 XPathDocument
对象。XPath 用于以编程方式计算表达式并选择文档中的特定节点。



回到顶端

要求

loadTOCNode(2, 'summary');

下面的列表列出了推荐使用的硬件、软件、网络基础结构以及所需的服务包:

Visual C# .NET

本文假定您熟悉下列主题:

XML 术语

创建和读取 XML 文件

XPath 语法



回到顶端

如何用 XPath 表达式查询 XML

loadTOCNode(2, 'summary');

在 Visual Studio .NET 中新建一个 Visual C# .NET 控制台应用程序。

备注

本示例使用名为 Books.xml 的文件。您可以创建自己的 Books.xml 文件,也可以使用 .NET 软件开发工具包 (SDK)
快速入门中包括的示例。如果您没有安装"快速入门"而且也不想安装它们,请参阅 Books.xml
下载位置的"参考"部分。如果已经安装了"快速入门",则该文件位于以下文件夹中:
Program Files/Microsoft.NET/FrameworkSDK/Samples/Quickstart/Howto/Samples/Xml/Transformxml/VB
必须将该文件复制到 /Bin/Debug 文件夹,该文件夹位于您在其中创建该项目的文件夹中。

确保该项目引用 System.Xml
名称空间。

Xml
XPath
名称空间上使用 using
语句,这样以后就不需要在代码中限定这些名称空间中的声明了。using
语句必须在所有其他声明之前使用,如下所示:

using System.Xml;

using System.Xml.XPath;


声明合适的变量。声明 XPathDocument
对象以保存 XML 文档,声明 XpathNavigator
对象以计算 XPath 表达式,声明 XPathNodeIterator
对象以迭代通过选定节点。声明 String
对象以保存 XPath 表达式。在 Class1 的 Main
函数中添加声明代码。

XPathNavigator nav;

XPathDocument docNav;

XPathNodeIterator NodeIter;

String strExpression;


用示例文件 Books.xml 加载 XPathDocument
XPathDocument
类使用可扩展样式表语言转换 (XSLT) 为 XML 文档处理提供快速和面向性能的缓存。它类似于 XML 文档对象模型 (DOM),但经过了高度优化,以用于 XSLT 处理和 XPath 数据模型。

// Open the XML.

docNav = new XPathDocument(@"c:/books.xml");


从文档创建 XPathNavigator
XPathNavigator
对象用于进行只读 XPath 查询。XPath 查询可返回结果值或许多节点。

// Create a navigator to query with XPath.

nav = docNav.CreateNavigator();


创建 XPath 表达式以查找图书的平均价格。这个 XPath 表达式返回单个值。有关 XPath 语法的完整详细信息,请参见"参考"部分中的"XPath 语法"。

// Find the average cost of a book.

// This expression uses standard XPath syntax.

strExpression = "sum(/bookstore/book/price) div count(/bookstore/book/price)";


使用 XPathNavigator
对象的 Evaluate
方法计算 XPath 表达式。Evaluate
方法返回该表达式的结果。

// Use the Evaluate method to return the evaluated expression.

Console.WriteLine("The average cost of the books are {0}", nav.Evaluate(strExpression));


创建 XPath 表达式以查找价格超过 10 美元的所有图书。这个 XPath 表达式只从 XML 源中返回 Title 节点。

// Find the title of the books that are greater then $10.00.

strExpression = "/bookstore/book/title[../price>10.00]";


为使用 XPathNavigator
Select
方法选择的节点创建 XPathNodeIterator
XPathNodeIterator
表示 XPath 节点集,因此它支持针对该节点集执行的操作。

// Select the node and place the results in an iterator.

NodeIter = nav.Select(strExpression);


使用从 XPathNavigator
Select
方法返回的 XPathNodeIterator
遍历选定的节点。在这种情况下,可使用 XPathNodeIterator
MoveNext
方法迭代通过选定的所有节点。

Console.WriteLine("List of expensive books:");

//Iterate through the results showing the element value.

while (NodeIter.MoveNext())

{

Console.WriteLine("Book Title:{0}", NodeIter.Current.Value);

};


使用 ReadLine
方法在控制台显示的末尾添加 pause,以便更容易地显示上述结果。

//Pause

Console.ReadLine();


生成并运行您的项目。请注意,这些结果显示在控制台窗口中。



回到顶端

疑难解答

loadTOCNode(2, 'summary');

在测试代码时,您可能会收到以下异常错误信息:

An unhandled exception of type 'System.Xml.XmlException' occurred in System.xml.dll

Additional information:System error.

该异常错误发生在以下代码行上:

docNav = new XPathDocument("c://books.xml");


该异常错误是由无效的处理指令导致的。例如,处理指令可能包含多余的空格。下面是无效处理指令的示例:

<?xml version='1.0'?>


若要解决该异常,请执行以下操作之一:

纠正无效的处理指令。下面是有效处理指令的示例:

<?xml version='1.0'?>


- 或 -

下面是有效处理指令的示例:
从 Books.xml 文件中删除 XML 处理指令。



回到顶端

参考

下列文件可从 Microsoft 下载中心下载: 立即下载 Books.xml (http://download.microsoft.com/download/...

loadTOCNode(1, 'references');

下列文件可从 Microsoft 下载中心下载:

收起这个图片
展开这个图片



立即下载 Books.xml

(http://download.microsoft.com/download/xml/utility/1.0.0.1/wxp/en-us/books.exe)

有关更多信息,请访问以下 Microsoft Web 站点:

.NET
中的 XML:.NET Framework XML Classes and C# Offer Simple, Scalable Data
Manipulation(.NET 中的 XML:.NET 框架 XML 类和 C# 提供简单的可缩放的数据操作)R/> http://msdn.microsoft.com/msdnmag/issues/01/01/xml/default.aspx

(http://msdn.microsoft.com/msdnmag/issues/01/01/xml/default.aspx)

XPathNavigator Class

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathNavigatorClassTopic.asp

(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathNavigatorClassTopic.asp)

XPathDocument Class(XPathDocument 类)

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathDocumentClassTopic.asp

(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathDocumentClassTopic.asp)

XPathNodeIterator Class(XPathNodeIterator 类)

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathNodeIteratorClassTopic.asp

(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXPathXPathNodeIteratorClassTopic.asp)

XSLT Transformations with the XslTransform Class(使用 XslTransform 类 的 XSLT 转换)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconxslttransformationswithxsltransformclass.asp
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconxslttransformationswithxsltransformclass.asp)

XPath Examples(XPath 示例)

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmrefxpathexamples.asp

(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmrefxpathexamples.asp)

XPath Syntax(XPath 语法)

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmrefxpathsyntax.asp

(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmrefxpathsyntax.asp)

有关 XPath 的更多信息,请访问下列 WWW 联合会 (W3C) Web 站点:

XML 路径语言 (XPath)

1.0 版:W3C 在 1999 年 11 月 16 日提出的建议

http://www.w3.org/TR/1999/REC-xpath-19991116

(http://www.w3.org/TR/1999/REC-xpath-19991116)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: