C# XML,谁知道最快的大体积XML读取方式

C# XML,谁知道最快的大体积XML读取方式,第1张

C#处理XML的方式很多,可以是XMLReader,可以载入到XMLDocument中直接读取Document或者用LINQ查询,可以使用XPathNavigater,某些情况下,还可以转换成ADOnet中的数据类型如DataSet,再去查询,或者通过反序列化转换成某一个类的实例。

其中,最快的方式是 XMLReader,它是一个“向前的”,“只读的”流模型,非常类似ADO中的SqlDataReader。它的局限性是不可以浏览和修改。通常是在一个循环当中遍历XML文件,当然你要查询某个特定的值可以放在这个循环中,找到后就退出,只要循环体中处理的合适,速度肯定比你查询XMLDocument快,当然也比在XMLDocument文档的基础上转换后的速度快。

直接读取XMLDocument Load()方法载入的文档速度也会比你用linkQ要快,相对于XMLReader,XMLDocument 的优点是可以“浏览”,即你不需要按照文档的顺序读取,可以直接定位,在查阅的时候可以“倒回去”取值,如使用GetElementByTagName()方法等,虽然方便,但是速度比不上XMLReader,因为XMLReader最多只对文档扫描一遍。当然XMLDocument 也可以修改,类似XMLReader,XMLWriter可以修改。

下面是使用XMLReader的一个简单例子:

XmlReader xReader = XmlReaderCreate("booksxml");

while (xReaderRead())

{

//按文档顺序遍历名为ElementName的节点

if (xReaderNodeType == XmlNodeTypeElement && xReaderName == "ElementName")

{

xReaderMoveToAttribute("YourAttrName");//按文档顺序直接跳到某个属性

richTextBox1AppendText(xReaderValue); //获取值

}

}

命名空间:SystemXML

XmlReader 提供的方法非常多,根据情况选择合适的方式,提高效率。

XmlNodeList xnl=docSelectNodes("//[@GlobalID='123']");//属性GlobalID=123的节点,不论节点在哪一级,节点叫什么名字

或XmlNodeList xnl=docSelectNodes("//RealTimeData[@GlobalID='123']");//属性GlobalID=123的RealTimeData节点,不论节点在哪一级,只要节点的名字叫RealTimeData

foreach(XmlNode xn in xnl)

{

xnInnerText//节点的值

}

主要就是知道怎么表达XML的路径

你可以参考一下

>

package comapplet;

import javaioByteArrayInputStream;

import javaioFile;

import javaioStringReader;

import javautilIterator;

import javautilList;

import orgapachecommonslangStringUtils;

import orgdom4jDocument;

import orgdom4jDocumentHelper;

import orgdom4jElement;

import orgdom4jioSAXReader;

public class B {

public static void main(String[] args) {

String inputBizInfo = "<xml version=\"10\" encoding=\"utf-8\">\n"

+ "<EAS>\n"

+ "  <Header>\n"

+ "    <TransID>e688030e-f86f-455b-b143-58871084670b</TransID>\n"

+ "    <TransTime>2015-05-29 02:12:15</TransTime>\n"

+ "    <DataType>Vendor/Customer</DataType>\n"

+ "    <OptCatalog>Single</OptCatalog>\n"

+ "    <OptType>Update/Create</OptType>\n"

+ "    <RowCount>1</RowCount>\n" + "  </Header>\n"

+ "  <MasterData>\n" + "    <Field name=\"UnitClass\">\n"

+ "      <!--单位分类-->2000 单位分类   测试一下\n" + "      </Field>\n"

+ "    <Field name=\"AccountGroup\">\n" + "      <!--账户组-->\n"

+ "      </Field>\n" + "    <Field name=\"Name1 \">\n"

+ "      <!--单位全称-->1111   文具公司\n" + "      </Field>\n"

+ "  </MasterData>\n" + "  <ChangeDetail>\n"

+ "    <ChangeFields name=\"Name1\">\n"

+ "      <OldValue>文具</OldValue>\n"

+ "      <NewValue>皮包</NewValue>\n"

+ "      <OperationType>修改</OperationType>\n"

+ "    </ChangeFields>\n" + "  </ChangeDetail>\n" + "</EAS>";

// 我想获得这个xml中遍历分别获得

// 2000 单位分类 测试一下 ,空, 1111 文具公司 这样的3组值,每组值中的数据 用空格隔开放到数组中去,应该怎么办呢

try {

SAXReader reader = new SAXReader();

String txt = inputBizInforeplaceAll("\n", "");

// Document doc = readerread(new StringReader(txt));

// Document doc = readerread(new

// File("F:\\zz\\FileRecv\\MyWebSocket\\src\\com\\applet\\NewFilexml"));

// Document doc = readerread(new ByteArrayInputStream(txt

// getBytes("UTF-8")));

// Systemerrprintln(txt);

// Systemerrprintln(rootattribute(0)getName());

Document doc = DocumentHelperparseText(txt);

Element root = docgetRootElement();

// Systemoutprintln("Root: " + rootgetName());

List projects = rootselectNodes("MasterData/Field");

// Systemerrprintln(projectssize());

Iterator it = projectsiterator();

while (ithasNext()) {

Element elm = (Element) itnext();

// Systemoutprintln("index:"+elmattributeValue("index")+" level:"+elmattributeValue("level")+" nickname:"+elmattributeValue("nickname")+" country:"+elmattributeValue("country")+" weiwang:"+elmattributeValue("weiwang"));

// Systemerrprintln(elmattributeValue(elmattribute(0)getName()));

// Systemerrprintln(elmgetTextTrim());

String text = elmgetTextTrim();

if (StringUtilsisNotBlank(text)) {

String[] split = textsplit(" ");

for (String string : split) {

//放入数组省略

Systemerrprintln(string);

}

}

}

} catch (Exception ex) {

exprintStackTrace();

}

}

}

Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件。> 2:<bookstore> 3:<!--记录书本的信息--> 4:<bookType="必修课"ISBN="7-111-19149-2"> 5:<title>数据结构</title> 6:<author>严蔚敏</author> 7:<price>3000</price> 8:</book> 9:<bookType="必修课"ISBN="7-111-19149-3"> 10:<title>路由型与交换型互联网基础</title> 11:<author>程庆梅</author> 12:<price>2700</price> 13:</book> 14:<bookType="必修课"ISBN="7-111-19149-4"> 15:<title>计算机硬件技术基础</title> 16:<author>李继灿</author> 17:<price>2500</price> 18:</book> 19:<bookType="必修课"ISBN="7-111-19149-5"> 20:<title>软件质量保证与管理</title> 21:<author>朱少民</author> 22:<price>3900</price> 23:</book> 24:<bookType="必修课"ISBN="7-111-19149-6"> 25:<title>算法设计与分析</title> 26:<author>王红梅</author> 27:<price>2300</price> 28:</book> 29:<bookType="选修课"ISBN="7-111-19149-1"> 30:<title>计算机 *** 作系统</title> 31:<author>7-111-19149-1</author> 32:<price>28</price> 33:</book> 34:</bookstore>为了方便读取,我还定义一个书的实体类,名为BookModel,具体内容如下: 1:using System; 2:using SystemCollectionsGeneric; 3:using SystemLinq; 4:using SystemText; 5: 6:namespace 使用XmlDocument 7: { 8:publicclass BookModel 9: { 10:public BookModel() 11: { } 12:/// <summary> 13:/// 所对应的课程类型 14:/// </summary> 15:privatestring bookType; 16: 17:publicstring BookType 18: { 19: get { return bookType; } 20: set { bookType = value; } 21: } 22: 23:/// <summary> 24:/// 书所对应的ISBN号 25:/// </summary> 26:privatestring bookISBN; 27: 28:publicstring BookISBN 29: { 30: get { return bookISBN; } 31: set { bookISBN = value; } 32: } 33: 34:/// <summary> 35:/// 书名 36:/// </summary> 37:privatestring bookName; 38: 39:publicstring BookName 40: { 41: get { return bookName; } 42: set { bookName = value; } 43: } 44: 45:/// <summary> 46:/// 作者 47:/// </summary> 48:privatestring bookAuthor; 49: 50:publicstring BookAuthor 51: { 52: get { return bookAuthor; } 53: set { bookAuthor = value; } 54: } 55: 56:/// <summary> 57:/// 价格 58:/// </summary> 59:privatedouble bookPrice; 60: 61:publicdouble BookPrice 62: { 63: get { return bookPrice; } 64: set { bookPrice = value; } 65: } 66: } 67: }1使用XmlDocument使用XmlDocument是一种基于文档结构模型的方式来读取XML文件在XML文件中,我们可以把XML看作是由文档声明(Declare),元素(Element),属性(Attribute),文本(Text)等构成的一个树最开始的一个结点叫作根结点,每个结点都可以有自己的子结点得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性例如: 1: xn 代表一个结点 2: xnName;//这个结点的名称 3: xnValue;//这个结点的值 4: xnChildNodes;//这个结点的所有子结点 5: xnParentNode;//这个结点的父结点 6: 11 读取所有的数据使用的时候,首先声明一个XmlDocument对象,然后调用Load方法,从指定的路径加载XML文件 1: XmlDocument doc = new XmlDocument(); 2: docLoad(@"\\Bookxml");然后可以通过调用SelectSingleNode得到指定的结点,通过GetAttribute得到具体的属性值参看下面的代码 1:// 得到根节点bookstore 2: XmlNode xn = xmlDocSelectSingleNode("bookstore"); 3: 4: 5:// 得到根节点的所有子节点 6: XmlNodeList xnl = xnChildNodes; 7: 8:foreach (XmlNode xn1 in xnl) 9: { 10: BookModel bookModel = new BookModel(); 11:// 将节点转换为元素,便于得到节点的属性值 12: XmlElement xe = (XmlElement)xn1; 13:// 得到Type和ISBN两个属性的属性值 14: bookModelBookISBN = xeGetAttribute("ISBN")ToString(); 15: bookModelBookType = xeGetAttribute("Type")ToString(); 16:// 得到Book节点的所有子节点 17: XmlNodeList xnl0 = xeChildNodes; 18: bookModelBookName=xnl0Item(0)InnerText; 19: bookModelBookAuthor=xnl0Item(1)InnerText; 20: bookModelBookPrice=ConvertToDouble(xnl0Item(2)InnerText); 21: bookModeListAdd(bookModel); 22: } 23: dgvBookInfoDataSource = bookModeList;在正常情况下,上面的代码好像没有什么问题,但是对于读取上面的XML文件,则会出错,原因就是因为我上面的XML文件里面有注释,大家可以参看Bookxml文件中的第三行,我随便加的一句注释注释也是一种结点类型,在没有特别说明的情况下,会默认它也是一个结点(Node)所以在把结点转换成元素的时候就会报错"无法将类型为“SystemXmlXmlComment”的对象强制转换为类型“SystemXmlXmlElement”。"幸亏它里面自带了解决办法,那就是在读取的时候,告诉编译器让它忽略掉里面的注释信息修改如下: 1: XmlDocument xmlDoc = new XmlDocument(); 2: XmlReaderSettings settings = new XmlReaderSettings(); 3: settingsIgnoreComments = true;//忽略文档里面的注释 4: XmlReader reader = XmlReaderCreate(@"\\Bookxml", settings); 5: xmlDocLoad(reader);最后读取完毕后,记得要关掉reader 1: readerClose();这样它就不会出现错误最后运行结果如下:12 增加一本书的信息向文件中添加新的数据的时候,首先也是通过XmlDocument加载整个文档,然后通过调用SelectSingleNode方法获得根结点,通过CreateElement方法创建元素,用CreateAttribute创建属性,用AppendChild把当前结点挂接在其它结点上,用SetAttributeNode设置结点的属性具体代码如下:加载文件并选出要结点: 1: XmlDocument doc = new XmlDocument(); 2: docLoad(@"\\Bookxml"); 3: XmlNode root = docSelectSingleNode("bookstore");创建一个结点,并设置结点的属性: 1: XmlElement xelKey = docCreateElement("book"); 2: XmlAttribute xelType = docCreateAttribute("Type"); 3: xelTypeInnerText = "adfdsf"; 4: xelKeySetAttributeNode(xelType);创建子结点: 1: XmlElement xelAuthor = docCreateElement("author"); 2: xelAuthorInnerText = "dfdsa"; 3: xelKeyAppendChild(xelAuthor);最后把book结点挂接在要结点上,并保存整个文件: 1: rootAppendChild(xelKey); 2: docSave(@"\\Bookxml");用上面的方法,是向已有的文件上追加数据,如果想覆盖原有的所有数据,可以更改一下,使用LoadXml方法: 1: XmlDocument doc = new XmlDocument(); 2: docLoadXml("<bookstore></bookstore>");//用这句话,会把以前的数据全部覆盖掉,只有你增加的数据直接把根结点选择出来了,后面不用SelectSingleNode方法选择根结点,直接创建结点即可,代码同上13 删除某一个数据想要删除某一个结点,直接找到其父结点,然后调用RemoveChild方法即可,现在关键的问题是如何找到这个结点,上面的SelectSingleNode可以传入一个Xpath表,我们通过书的ISBN号来找到这本书所在的结点如下: 1: XmlElement xe = xmlDocDocumentElement; // DocumentElement 获取xml文档对象的根XmlElement 2:string strPath = stringFormat("/bookstore/book[@ISBN=\"{0}\"]", dgvBookInfoCurrentRowCells[1]ValueToString()); 3: XmlElement selectXe = (XmlElement)xeSelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点 4: selectXeParentNodeRemoveChild(selectXe);"/bookstore/book[@ISBN=\"{0}\"]"是一个Xpath表达式,找到ISBN号为所选那一行ISBN号的那本书,有关Xpath的知识请参考:XPath 语法14 修改某要条数据修改某 条数据的话,首先也是用Xpath表达式找到所需要修改的那一个结点,然后如果是元素的话,就直接对这个元素赋值,如果是属性的话,就用SetAttribute方法设置即可如下: 1: XmlElement xe = xmlDocDocumentElement; // DocumentElement 获取xml文档对象的根XmlElement 2:string strPath = stringFormat("/bookstore/book[@ISBN=\"{0}\"]", dgvBookInfoCurrentRowCells[1]ValueToString()); 3: XmlElement selectXe = (XmlElement)xeSelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点 4: selectXeSetAttribute("Type", dgvBookInfoCurrentRowCells[0]ValueToString());//也可以通过SetAttribute来增加一个属性 5: selectXeGetElementsByTagName("title")Item(0)InnerText = dgvBookInfoCurrentRowCells[2]ValueToString(); 6: selectXeGetElementsByTagName("author")Item(0)InnerText = dgvBookInfoCurrentRowCells[3]ValueToString(); 7: selectXeGetElementsByTagName("price")Item(0)InnerText = dgvBookInfoCurrentRowCells[4]ValueToString(); 8: xmlDocSave(@"\\Bookxml");2使用XmlTextReader和XmlTextWriterXmlTextReader和XmlTextWriter是以流的形式来读写XML文件21XmlTextReader使用XmlTextReader读取数据的时候,首先创建一个流,然后用read()方法来不断的向下读,根据读取的结点的类型来进行相应的 *** 作如下: 1: XmlTextReader reader = new XmlTextReader(@"\\Bookxml"); 2: List<BookModel> modelList = new List<BookModel>(); 3: BookModel model = new BookModel(); 4:while (readerRead()) 5: { 6: 7:if (readerNodeType == XmlNodeTypeElement) 8: { 9:if (readerName == "book") 10: { 11: modelBookType = readerGetAttribute(0); 12: modelBookISBN = readerGetAttribute(1); 13: } 14:if (readerName == "title") 15: { 16: modelBookName=readerReadElementString()Trim(); 17: } 18:if (readerName == "author") 19: { 20: modelBookAuthor = readerReadElementString()Trim(); 21: } 22:if (readerName == "price") 23: { 24: modelBookPrice = ConvertToDouble(readerReadElementString()Trim()); 25: } 26: } 27: 28:if (readerNodeType == XmlNodeTypeEndElement) 29: { 30: modelListAdd(model); 31: model = new BookModel(); 32: } 33: 34: 35: } 36: modelListRemoveAt(modelListCount-1); 37:thisdgvBookInfoDataSource = modelList;关键是读取属性的时候,你要先知道哪一个结点具有几个属性,然后通过GetAttribute方法来读取读取属性还可以用另外一种方法,就是用MoveToAttribute方法可参见下面的代码: 1:if (readerName == "book") 2: { 3:for (int i = 0; i < readerAttributeCount; i++) 4: { 5: readerMoveToAttribute(i); 6:string str = "属性:" + readerName + "=" + readerValue; 7: } 8: modelBookType = readerGetAttribute(0); 9: modelBookISBN = readerGetAttribute(1); 10: }效果如下:22XmlTextWriterXmlTextWriter写文件的时候,默认是覆盖以前的文件,如果此文件名不存在,它将创建此文件首先设置一下,你要创建的XML文件格式, 1: XmlTextWriter myXmlTextWriter = new XmlTextWriter(@"\\Book1xml", null); 2://使用 Formatting 属性指定希望将 XML 设定为何种格式。

最简单的方式是用

DataSetReadXml()

方法读入

XML

数据到一个DataTable中,然后把这个DataTable绑顶到你的下拉框上去即可。

如果你用自定义对象模型,不用DataSet存储数据,那就要用XmlDocument对象或XmlReader读取XML了。

XmlDocument提供了DOM模型访问XML,能够使用XPath技术访问XML中的任意节点。

XmlReader提供了对XML数据的只读的流式访问,速度较快,但是只读向前的。

具体用那个,就看你的应用场合需要了。

1、用 childNodes 属性,按顺序取

实现过程:首先创建一个 xml 对象,然后载入 xml 文件,再根据待取节点父节点在 xml 文件中的序号和本身的序号,确定待取节点的位置,最后返回待取节点的值。

//pId 待取节点父节点序号

//cId 待取节点序号

function getXmlNodeValue(pId, cId) {

var xmlDoc = new ActiveXObject("MicrosoftXMLDOM");

xmlDocasync = false;

xmlDocload("employeeInfoxml");

var nodes = xmlDocdocumentElementchildNodes[pId]childNodes[cId];return nodeschildNodes[0]text;

}

调用方法:alert(getXmlNodeValue(1, 2));

2、用 for 循环来取

实现过程:首先创建一个 ie 支持的 xml 对象,如果发生异常,是创建一个 FireFox 支持的空 xml 对象并返回空;然后载入 xml 文件,如要发生异常也返回空;最后,通过 for 循环遍历查找与传入的节点值相同的节点,找到后返回属于该节点的属性值。

//nodeValue 待取节点的所属节点值

function getXmlNodeValueFor(nodeValue){

var xmlDoc; 

try { 

//创建一个 ie 支持的 XML 文档对象 

xmlDoc = new ActiveXObject("MicrosoftXMLDOM");

}catch(e){

try{

//创建FireFox空的XML文档对象

xmlDoc=documentimplementationcreateDocument("","",null);

}catch(e){

alert(emessage);

return "";

}

}

xmlDocasync = false;

try { 

xmlDocload("employeeInfoxml");

}catch(e){

alert(emessage);

return "";

}

var xd=xmlDocdocumentElementchildNodes;

if(xd==null)

return "";

var tempValue;

for(var i=0;i<xdlength;i++){

if(xd[i]childNodes[0]childNodes[0]nodeValue==nodeValue) tempValue=xd[i]childNodes[2]childNodes[0]nodeValue;

}

return tempValue;

}

第一种:使用XPath

XML的路径我配置在webconfig

的appSettings节点下

Hashtable ht = new Hashtable();

string orgCodePath = ServerMapPath(ConfigurationSettingsAppSettings["orgCodePath"]);

//string orgCodePath = ServerMapPath("//template/home/orgCodexml");

XmlDocument xmldoc = new XmlDocument();

xmldocLoad(orgCodePath);

//获取节点列表

XmlNodeList topM = xmldocSelectNodes("//Organization");

foreach (XmlElement element in topM)

{

string id = elementGetElementsByTagName("ID")[0]InnerText;

string domainName = elementGetElementsByTagName("DomainName")[0]InnerText;

htAdd(id, domainName);

}

第二种:遍历式读取XML

//打开某文件(假设webconfig在根目录中)

string filename=ServerMapPath("/") + @"WebApplication1/webconfig";

XmlDocument xmldoc= new XmlDocument();

xmldocLoad(filename);

//得到顶层节点列表

XmlNodeList topM=xmldocDocumentElementChildNodes;

foreach(XmlElement element in topM)

{

if(elementNameToLower()=="appsettings")

{

//得到该节点的子节点

XmlNodeList nodelist=elementChildNodes;

if ( nodelistCount >0 )

{

//DropDownList1ItemsClear();

foreach(XmlElement el in nodelist)//读元素值

{

//DropDownList1ItemsAdd(elAttributes["key"]InnerXml);

//thisTextBox2Text=elAttributes["key"]InnerText;

thisTextBox2Text=elAttributes["key"]Value;

thisLabel1Text=elAttributes["value"]Value;

//同样在这里可以修改元素值,在后面save。

// elAttributes["value"]Value=thisTextBox2Text;

}

}

}

}

xmldocSave(filename);

读取xml任意节点

XmlNode node=docSelectSingleNode("/configuration/appSettings/add"); //按照节点目录查询

if(node!=null)

{

string k=nodeAttributes["key"]Value;

string v=nodeAttributes["value"]Value;

node=null;

}

XmlNode node=docSelectSingleNode("/configuration/appSettings/add");

if(node!=null)

{

XmlNodeReader nr=new XmlNodeReader(node);

nrMoveToContent();

//检查当前节点是否是内容节点。如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。

nrMoveToAttribute("value");

string s=nrValue;

node=null;

}

以上就是关于C# XML,谁知道最快的大体积XML读取方式全部的内容,包括:C# XML,谁知道最快的大体积XML读取方式、C# XML 如何直接根据属性值 读取 对应的值 怎么写、用java解析获得xml中的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9270730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存