还是问XmlTextReader和XmlTextWriter一起实现对xml文件的更新、修改、删除操作(代码)
之前已经问过一次这个问题,在大家的帮助下,终于有了一点起色,但还没有能最终解决问题,现将xml和代码都贴上来,希望能得到高手帮忙。。
XML:
FoverCode.xml:
<?xml version="1.0" encoding="GB2312"?>
<FavorCode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FavorCode.xsd">
<GeneralSettings>
<RecentID>0</RecentID>
<LastUpdate>1967-08-15</LastUpdate>
<EnableAutoUpdate>1</EnableAutoUpdate>
<ShareSum>0</ShareSum>
</GeneralSettings>
<CodeCatag ID="1" Description="SqlServer">
<Code ID="1" Description="StringA">
<Article ID="1">
<Name>StringA</Name>
<Author>String</Author>
<StoreDate>1967-08-13</StoreDate>
<Detail><![CDATA[sdersdfsdfsdfsdfsdfsf]]></Detail>
<Remark>StringA</Remark>
<Level>0</Level>
</Article>
<Article ID="2">
<Name>Stringd</Name>
<Author>String2</Author>
<StoreDate>1967-08-13</StoreDate>
<Detail>String2</Detail>
<Remark>String2</Remark>
<Level>0</Level>
</Article>
</Code>
<Code ID="2" Description="StringB">
<Article ID="3">
<Name>Stringe</Name>
<Author>String</Author>
<StoreDate>1967-08-13</StoreDate>
<Detail>String3</Detail>
<Remark>String3</Remark>
<Level>0</Level>
</Article>
<Article ID="4">
<Name>Stringf</Name>
<Author>String</Author>
<StoreDate>1967-08-13</StoreDate>
<Detail>String4</Detail>
<Remark>String4</Remark>
<Level>0</Level>
</Article>
</Code>
</CodeCatag>
<CodeCatag ID="2" Description="C#">
<Code ID="3" Description="正则表达式">
<Article ID="5">
<Name>身份证</Name>
<Author>Wintle</Author>
<StoreDate>2003-10-27</StoreDate>
<Detail>\d{17}(\d|[xX]){1}|\d{15}</Detail>
<Remark>解决了最后一位是xX的问题</Remark>
<Level>3</Level>
</Article>
<Article ID="6">
<Name>EMail</Name>
<Author>Wintle</Author>
<StoreDate>1967-08-13</StoreDate>
<Detail>\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*</Detail>
<Remark>一般</Remark>
<Level>0</Level>
</Article>
</Code>
<Code ID="4" Description="DataGrid">
<Article ID="7">
<Name>String</Name>
<Author>String</Author>
<StoreDate>1967-08-13</StoreDate>
<Detail>String</Detail>
<Remark>String</Remark>
<Level>0</Level>
</Article>
<Article ID="8">
<Name>String</Name>
<Author>String</Author>
<StoreDate>1967-08-13</StoreDate>
<Detail>String</Detail>
<Remark>String</Remark>
<Level>0</Level>
</Article>
</Code>
</CodeCatag>
</FavorCode>
代码(希望实现更新Article下的内容,通过Article的ID属性):
private void btnReadXml_Click(object sender, System.EventArgs e)
{
if(System.IO.File.Exists(Application.StartupPath+"\\~FavorCode.xml"))
{
XmlTextReader reader = new XmlTextReader(Application.StartupPath+"\\~FavorCode.xml");
XmlTextWriter write = new XmlTextWriter(Application.StartupPath+"\\~~FavorCode.xml",System.Text.Encoding.GetEncoding("GB2312"));
write.Formatting=Formatting.Indented;
reader.MoveToContent(); reader.WhitespaceHandling=WhitespaceHandling.None;
write.WriteStartDocument();
write.WriteStartElement(reader.Name);
write.WriteAttributes(reader,true);
while(reader.Read())
{
if(reader.NodeType==XmlNodeType.Element)
{
switch(reader.LocalName)
{
case "GeneralSettings":
write.WriteNode(reader,true);
break;
case "CodeCatag": ///(A处)
write.WriteStartElement("CodeCatag");
write.WriteAttributes(reader,true);
break;
case "Code":
write.WriteStartElement("Code");
write.WriteAttributes(reader,true);
break;
case "Article":
if(reader.GetAttribute("ID").Trim().Equals(this.txtArticleID.Text.Trim()))
{ write.WriteStartElement("Article"); write.WriteAttributeString("ID",reader.GetAttribute("ID"));
write.WriteElementString("Name",this.txtName.Text);
write.WriteElementString("Author",this.txtAuthor.Text);
write.WriteElementString("StoreDate",this.txtStoreDate.Text);
write.WriteStartElement("Detail");
write.WriteCData(this.rtxtXml.Text);
write.WriteEndElement();
write.WriteStartElement("Remark");
write.WriteCData(this.rtxtXml.Text);
write.WriteEndElement();
write.WriteElementString("Level",reader.GetAttribute("ID"));
write.WriteEndElement();
}
else { write.WriteNode(reader,true);
}
break;
}
}
else if(reader.NodeType==XmlNodeType.EndElement)
{
switch(reader.LocalName)
{ case "CodeCatag": ///(B处)
write.WriteEndElement(); break;
case "Code":
write.WriteEndElement();
break;
}
}
}
write.WriteEndElement();
write.WriteEndDocument();
write.Flush();
write.Close();
reader.Close();
}
}
基本思路是从原文件中读出来,然后写到一个新的xml里去。但是出现了问题:
1、如果B处存在,就报错。
2、如果把B处去掉,则在A处出一个问题,即当写到新的~~FavorCode.xml中时,第一个<CodeCatag..>不存在。
请高手见教!!!
由于FavorCode.xml可能会很大,所以只能采用xmltextreader和writer的方式吧,但我不知道我理解的对不对,这样处理?但我实在想不到什么更好的方式了。我是想如果可以直接不用这个倒来倒去就好了,而是直接在FavorCode.xml中操作。