日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

修改大型 XML 文件的有效方法

發(fā)布時間:2024/4/15 asp.net 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 修改大型 XML 文件的有效方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
隨著 XML 成為大型信息源的常用表示格式,開發(fā)人員編輯大型 XML 文件時開始遇到問題。對于處理大型日志文件以及經(jīng)常需要為這些文件追加信息的應(yīng)用程序,尤其如此。編輯 XML 文件最直接的方法是,將其加載到 XmlDocument 中,在內(nèi)存中修改文檔,然后將其保存回磁盤。但是,這樣做意味著要將整個 XML 文檔加載到內(nèi)存中,由于文檔太大或應(yīng)用程序需要的內(nèi)存不夠,這種方法可能會行不通。

這篇論文說明了修改 XML 文檔的一些可供選擇的方法,這些方法不涉及將文檔加載到 XmlDocument 實例中的內(nèi)容。

使用 XML 包含方法
建議的第一種方法對于向 XML 日志文件追加值最為有用。開發(fā)人員面臨的常見問題是需要一種能夠?qū)⑿聴l目簡單地追加到日志文件中而不用加載文檔的方法。因為 XML 具有良好結(jié)構(gòu)規(guī)則,所以使用傳統(tǒng)方式(這種方法會因為日志文件格式不正確而結(jié)束日志文件)來向 XML 日志文件追加條目通常是非常困難的。

要說明的第一種方法是針對這樣的情形,即目的是能夠?qū)l目快速地追加到 XML 文檔中。這種方法包括創(chuàng)建兩個文件。第一個文件是格式正確的 XML 文件,第二個是 XML 片段。格式正確的 XML 文件包括 XML 片段,XML 片段使用 DTD 中聲明的 external entity 或者使用 xi:include element 。使用包含文件,通過在進行處理過程中簡單地追加到 XML 文件,可以有效地更新文件包含 XML 片段的方法。包含文件和被包含文件的示例如下所示:

Logfile.xml:
<?xml version="1.0"?>
<!DOCTYPE logfile [
<!ENTITY events
SYSTEM "logfile-entries.txt">
]>
<logfile>
&events;
</logfile>

Logfile-events.txt:
<event>
<ip>127.0.0.1</ip>
<http_method>GET</http_method>
<file>index.html</file>
<date>2004-04-01T17:35:20.0656808-08:00</date>
</event>
<event>
<ip>127.0.0.1</ip>
<http_method>GET</http_method>
<file>stylesheet.css</file>
<date>2004-04-01T17:35:23.0656120-08:00</date>
<referrer>http://www.example.com/index.html</referrer>
</event>
<event>
<ip>127.0.0.1</ip>
<http_method>GET</http_method>
<file>logo.gif</file>
<date>2004-04-01T17:35:25.238220-08:00</date>
<referrer>http://www.example.com/index.html</referrer>
</event>

logfile-entries.txt 文件包括一個 XML 片段,并且可以使用典型的文件 IO 方法有效地進行更新。下面的代碼說明了如何通過將條目追加到文本文件的結(jié)尾來將它添加到 XML 日志文件中。


using?System;
using?System.IO;
using?System.Xml;?

public?class?Test{?
public?static?void?Main(string[]?args){

StreamWriter?sw?
=?File.AppendText("logfile-entries.txt");
XmlTextWriter?xtw?
=?new?XmlTextWriter(sw);?

xtw.WriteStartElement(
"event");?
xtw.WriteElementString(
"ip",?"192.168.0.1");
xtw.WriteElementString(
"http_method",?"POST");
xtw.WriteElementString(
"file",?"comments.aspx");
xtw.WriteElementString(
"date",?"1999-05-05T19:25:13.238220-08:00");?

xtw.Close();

}

}


一旦條目被追加到文本文件中,使用傳統(tǒng)的 XML 處理方法,就可以處理 XML 日志文件中的條目。下面的代碼使用 XPath 遍歷了 logfile.xml 中的日志事件,同時列出了它們被訪問時的文件以及被訪問的文件。


using?System;
using?System.Xml;?

public?class?Test2{

public?static?void?Main(string[]?args){

XmlValidatingReader?vr?
=?
new?XmlValidatingReader(new?XmlTextReader("logfile.xml"));
vr.ValidationType?
=?ValidationType.None;?
vr.EntityHandling?
=?EntityHandling.ExpandEntities;?

XmlDocument?doc?
=?new?XmlDocument();?
doc.Load(vr);?

foreach(XmlElement?element?in?doc.SelectNodes("//event")){

string?file?=?element.ChildNodes[2].InnerText;?
string?date?=?element.ChildNodes[3].InnerText;?

Console.WriteLine(
"{0}?accessed?at?{1}",?file,?date);

}
?
}

}
?


上面的代碼導(dǎo)致了下面的輸出:

index.html accessed at 2004-04-01T17:35:20.0656808-08:00
stylesheet.css accessed at 2004-04-01T17:35:23.0656120-08:00
logo.gif accessed at 2004-04-01T17:35:25.238220-08:00
comments.aspx accessed at 1999-05-05T19:25:13.238220-08:00


更改 XmlReader 為 XmlWriter
在某些情況下,除了只將元素追加到根元素中外,還需要對 XML 文件執(zhí)行更復(fù)雜的操作。例如,要篩選日志文件中的每一個條目,而這些條目在存檔到日志文件前不符合某些特殊標準。要完成此任務(wù)的一種方法是將 XML 文件加載到 XmlDocument 中,然后通過 XPath 選擇感興趣的事件。但是,這樣做涉及將整個文檔加載到內(nèi)存中,如果文檔太大,則這種做法會受到限制。另一種選擇方法為了這種任務(wù)會涉及使用 XSLT,但是由于整個 XML 文檔需要保存到內(nèi)存中,這種方法會和 XmlDocument 方法一樣遇到相同的問題。另外,由于開發(fā)人員不熟悉 XSLT,了解如何正確使用模板匹配時會遇到較大的困難。

要解決如何處理大型 XML 文檔問題的一種方法是使用 XmlReader 讀取 XML,讀取的同時使用 XmlWriter 將其寫出。使用這種方法,整個文檔不會同時存入內(nèi)存中,對 XML 可以進行更精確的更改而不只是追加元素。下面的代碼示例讀取前面部分的 XML 文檔,篩選出所有 ip 元素的值為 "127.0.0.1" 的事件后將其保存為存檔文件。


using?System;
using?System.Xml;?
using?System.IO;
using?System.Text;
public?class?Test2{
static?string?ipKey;
static?string?httpMethodKey;
static?string?fileKey;?
static?string?dateKey;
static?string?referrerKey;?

public?static?void?WriteAttributes(XmlReader?reader,?XmlWriter?writer){

if(reader.MoveToFirstAttribute()){
do{
writer.WriteAttributeString(reader.Prefix,?
reader.LocalName,?

reader.NamespaceURI,
reader.Value);?
}
while(reader.MoveToNextAttribute());
reader.MoveToElement();?
}

}


public?static?void?WriteEvent(XmlWriter?writer,?string?ip,
string?httpMethod,?string?file,
string?date,?string?referrer){

writer.WriteStartElement(
"event");?
writer.WriteElementString(
"ip",?ip);
writer.WriteElementString(
"http_method",?httpMethod);
writer.WriteElementString(
"file",?file);
writer.WriteElementString(
"date",?date);?
if(referrer?!=?null)?writer.WriteElementString("referrer",?referrer);
writer.WriteEndElement();?

}
?

public?static?void?ReadEvent(XmlReader?reader,?out?string?ip,
out?string?httpMethod,?out?string?file,
out?string?date,?out?string?referrer){

ip?
=?httpMethod?=?file?=?date?=?referrer?=?null;?

while(?reader.Read()?&&?reader.NodeType?!=?XmlNodeType.EndElement){?

if?(reader.NodeType?==?XmlNodeType.Element)?{

if(reader.Name?==?ipKey){?
ip?
=?reader.ReadString();?
}
else?if(reader.Name?==?httpMethodKey){?
httpMethod?
=?reader.ReadString();
}
else?if(reader.Name?==?fileKey){?
file?
=?reader.ReadString();
}
else?if(reader.Name?==?dateKey){?
date?
=?reader.ReadString();
//?reader.Read();?//?使用結(jié)尾標記
}
else?if(reader.Name?==?referrerKey){?
referrer?
=?reader.ReadString();
}

}
//if?
}
//while?
}


public?static?void?Main(string[]?args){
string?ip,?httpMethod,?file,?date,?referrer;?
//使用用于進行比較的字符串設(shè)置?XmlNameTable
XmlNameTable?xnt?=?new?NameTable();?
ipKey?
=?xnt.Add("ip");?
httpMethodKey?
=?xnt.Add("http_method");?
fileKey?
=?xnt.Add("file");
dateKey?
=?xnt.Add("date");
referrerKey?
=?xnt.Add("referrer");

//使用上面的?XmlNameTable?加載?XmlTextReader?
XmlTextReader?xr?=?new?XmlTextReader("logfile.xml",?xnt);
xr.WhitespaceHandling?
=?WhitespaceHandling.Significant;

XmlValidatingReader?vr?
=?new?XmlValidatingReader(xr);
vr.ValidationType?
=?ValidationType.None;
vr.EntityHandling?
=?EntityHandling.ExpandEntities;?


StreamWriter?sw?
=?
new?StreamWriter?("logfile-archive.xml",?false,?Encoding.UTF8?);?
XmlWriter?xw?
=?new?XmlTextWriter?(sw);?

vr.MoveToContent();?
//?移到文檔元素?
xw.WriteStartElement(vr.Prefix,?vr.LocalName,?vr.NamespaceURI);
WriteAttributes(vr,?xw);?

vr.Read();?
//?移到文檔元素的第一個?<event>?子元素
//?寫出不是?127.0.0.1(本地主機)中的事件
do
{
ReadEvent(vr,?
out?ip,?out?httpMethod,?
out?file,?out?date,?out?referrer);
if(!ip.Equals("127.0.0.1")){
WriteEvent(xw,ip,?httpMethod,?file,?date,?referrer);?
}

vr.Read();?
//移到下一個?<event>?元素或?<logfile>?的結(jié)尾標記
}
?while(vr.NodeType?==?XmlNodeType.Element);

Console.WriteLine(
"Done");

vr.Close();
xw.Close();
}

}




上面的代碼示例在寫入到 logfile-archive.xml 文件中時會導(dǎo)致下面的輸出:

<logfile>
<event>
<ip>192.168.0.1</ip>
<http_method>POST</http_method>
<file>comments.aspx</file>
<date>1999-05-05T19:25:13.238220-08:00</date>
</event>
</logfile>

除了使用 XmlReader 到 XmlWriter 的鏈之外,上面代碼的另一個有趣方面是,使用 ReadEvent() 方法檢查元素標記名稱時使用 NameTable 提高了文本比較的性能。在 XmlReader 中使用這種方法檢查元素的標記名稱的優(yōu)點在如下的 MSDN 文檔主題中進行了概述:Object Comparison Using XmlNameTable with XmlReader(英文)。

轉(zhuǎn)載于:https://www.cnblogs.com/Dragon-China/archive/2007/01/10/616900.html

總結(jié)

以上是生活随笔為你收集整理的修改大型 XML 文件的有效方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美老少做受xxxx高潮 | 国产中年熟女高潮大集合 | 鲁鲁久久 | 精品国产乱码久久久久夜深人妻 | 插插射射 | 最近免费中文字幕中文高清百度 | 98色 | 日本成人网址 | 二区三区av | 欧美专区在线视频 | 偷拍亚洲另类 | 成av人在线| 精品处破女学生 | www.婷婷色 | 丰满岳跪趴高撅肥臀尤物在线观看 | 在线观看黄色av网站 | 特黄三级又爽又粗又大 | 成年人视频免费 | 午夜三级视频 | 在线看成人 | 日日干夜夜骑 | 色中色综合网 | 恶虐女帝安卓汉化版最新版本 | 天堂va欧美va亚洲va老司机 | 国产精品亚洲一区二区三区 | 影音先锋国产精品 | 色综合久久av | 国产一区二区三区小说 | 亚洲视频www| 69人妻精品久久无人专区 | 色哟哟免费视频 | 久久久性色精品国产免费观看 | 日韩精品免费一区二区三区 | 999精彩视频 | 国产精品自慰网站 | 草草草在线观看 | 国产成人传媒 | 国产精品白嫩白嫩大学美女 | 草草在线视频 | 欧美日韩亚洲免费 | 亚洲色图40p | 久久久久免费精品 | 国产毛片一区 | 国产99在线播放 | 91玉足脚交嫩脚丫在线播放 | 激情欧美亚洲 | 日一区二区 | 欧美性三级 | 国产男女无遮挡猛进猛出 | 91免费在线播放 | 天天搞天天 | 精品视频一区二区在线观看 | 69精品在线 | 国产亚洲欧美日韩精品一区二区三区 | 亚洲精选一区二区 | 亚洲人成人一区二区在线观看 | 爱爱视频在线播放 | 国产91边播边对白在线 | 色屁屁一区二区三区 | eeuss一区二区 | 欧美福利视频在线观看 | 国产男女猛烈无遮挡 | 中文字幕精品一区二区三区视频 | www.日本com| 无码人妻精品一区二区三区9厂 | 麻豆精品免费 | 一本色道av | 男人午夜天堂 | 亚洲女人av | 国产精品免费久久久久 | 免费av在线网站 | 久久免费福利 | 日韩国产在线一区 | 日韩精品一区二区三区在线视频 | 婷婷国产在线 | 91精品国产综合久久福利软件 | 人人爱人人 | 中文字幕人妻一区 | 欧美少妇一区 | 亚洲欧美一区二区在线观看 | 日韩精品成人 | 国产一区二区三区四区五区 | 欧美成人怡红院 | 草草色 | 青青草原综合久久大伊人精品 | 午夜性色福利影院 | 午夜视频在线免费观看 | 91国内精品野花午夜精品 | 色5月婷婷 | 在线国产视频一区 | 女人脱了内裤趴开腿让男躁 | 麻豆精品在线看 | 韩国三级hd中文字幕的背景音乐 | 日韩一级免费毛片 | 中文字幕日韩一区二区三区 | 亚洲精品视频一区二区三区 | 久久艹国产精品 | 人妻天天爽夜夜爽一区二区三区 | 97精品一区二区三区 |