using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;
using System.Collections;
using System.Reflection;
namespace Rca4.libLng
{
public class ClassLng
{
private bool IsCreateXmlItems = true;
private static string _lngCode = "";
private static Hashtable lngUI = null;
private static Hashtable lngMsg = null;
private string _LanguagePath;
private string _Prefix;
private string _Default;
XmlDocument xmlDoc;
XmlDocument xmlMsgDoc;
/// <summary>
/// 语言对象初始化
/// </summary>
/// <param name="LanguagePath">语言包目录</param>
/// <param name="Prefix">语言包文件前缀</param>
/// <param name="Default">默认语言标识</param>
public ClassLng(string LanguagePath, string Prefix,string Default)
{
_LanguagePath = LanguagePath;
_Prefix = Prefix;
_Default = Default;
if (IsCreateXmlItems)
{
string xmlData = @"<?xml version='1.0' encoding='utf-8' ?>
<Resource>
<Messages>
</Messages>
<Items>
</Items>
</Resource>";
xmlDoc = new XmlDocument();
xmlDoc.Load(new StringReader(xmlData));
xmlMsgDoc = new XmlDocument();
FileInfo fi = new FileInfo("Msg.xml");
if (!fi.Exists)
{
xmlMsgDoc.Load(new StringReader(xmlData));
}
else
{
XmlReader reader = new XmlTextReader("Msg.xml");
xmlMsgDoc.Load(reader);
}
}
}
public string lngCode
{
get
{
return _lngCode;
}
set
{
if (_lngCode != value)
{
_lngCode = value;
this.ReadResource();
}
}
}
/// <summary>
/// 读取语言消息
/// </summary>
/// <param name="Name">语言消息名称</param>
/// <param name="Default">默认值</param>
public string Read(string Name)
{
if (IsCreateXmlItems)
{
//加入一个元素
bool IsNotFind = true;
XmlNodeList nodeList = xmlMsgDoc.SelectSingleNode("Resource/Messages").ChildNodes;
foreach(XmlNode node in nodeList)
{
if (node.Attributes["key"].InnerText == Name.ToLower())
{
IsNotFind = false;
break;
}
}
if (IsNotFind)
{
XmlNode NodeItems = xmlMsgDoc.SelectSingleNode("Resource/Messages");
XmlElement xeitem = xmlMsgDoc.CreateElement("Message");//创建一个<Item>节点
xeitem.SetAttribute("key", Name.ToLower());//设置该节点key属性
xeitem.InnerText = Name;
NodeItems.AppendChild(xeitem);
xmlMsgDoc.Save("Msg.xml");
}
}
if (lngMsg.Contains(Name.ToLower()))
{
return (string)lngMsg[Name.ToLower()];
}
else
{
return Name;
}
}
/// <summary>
/// 读取语言包
/// </summary>
private void ReadResource()
{
lngUI = new Hashtable();
lngMsg = new Hashtable();
XmlReader reader = null;
FileInfo fi = new FileInfo(_LanguagePath + "//" + _Prefix + _lngCode + ".xml");
if (!fi.Exists)
reader = new XmlTextReader(_LanguagePath + "//" + _Prefix + _Default + ".xml");
else
reader = new XmlTextReader(_LanguagePath + "//" + _Prefix + _lngCode + ".xml");
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNode root = doc.DocumentElement;
XmlNodeList nodelist1 = root.SelectNodes("Items/Item");
foreach (XmlNode node in nodelist1)
{
try
{
XmlNode node1 = node.SelectSingleNode("@key");
if (node1 != null)
{
lngUI.Add(node1.InnerText.ToLower(), node.InnerText);
}
}
catch (FormatException fe)
{
Console.WriteLine(fe.ToString());
}
}
//消息语言
XmlNodeList nodelist2 = root.SelectNodes("Messages/Message");
foreach (XmlNode node in nodelist2)
{
try
{
XmlNode node1 = node.SelectSingleNode("@key");
if (node1 != null)
{
lngMsg.Add(node1.InnerText.ToLower(), node.InnerText);
}
}
catch (FormatException fe)
{
Console.WriteLine(fe.ToString());
}
}
reader.Close();
}
/// <summary>
/// 更改语言
/// </summary>
/// <param name="form">要更改语言的窗口</param>
public void ChangeLngNames(Form form)
{
string[] Propertys = { "Text", "Caption"};
int Pro_reg;
string lngText="";
if (IsCreateXmlItems)
{
//加入一个元素
XmlNode NodeItemsFrm = xmlDoc.SelectSingleNode("Resource/Items");
XmlElement xeitemFrm = xmlDoc.CreateElement("Item");//创建一个<Item>节点
xeitemFrm.SetAttribute("key", form.Text.ToLower());//设置该节点key属性
xeitemFrm.InnerText = form.Text;
NodeItemsFrm.AppendChild(xeitemFrm);
}
if (lngUI.Contains(form.Text.ToLower()))
{
form.Text = (string)lngUI[form.Text.ToLower()];
}
System.Reflection.FieldInfo[] fieldInfo = form.GetType().GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
for (int i = 0; i < fieldInfo.Length; i++)
{
for (Pro_reg=0; Pro_reg < Propertys.Length; Pro_reg++)
{
lngText = GetPropertyValue(fieldInfo[i].GetValue(form), Propertys[Pro_reg]).ToString();
if (lngText != "")
{
break;
}
}
if (lngText != "")
{
if (lngUI.Contains(lngText.ToLower()))
{
if (IsCreateXmlItems)
{
XmlNode NodeItems = xmlDoc.SelectSingleNode("Resource/Items");
XmlElement xeitem = xmlDoc.CreateElement("Item");//创建一个<Item>节点
xeitem.SetAttribute("key", lngText.ToLower());//设置该节点key属性
xeitem.InnerText = lngText;
NodeItems.AppendChild(xeitem);
}
//设置语言值
SetPropertyValue(fieldInfo[i].GetValue(form), Propertys[Pro_reg], (string)lngUI[lngText.ToLower()]);
}
}
}
if (IsCreateXmlItems) xmlDoc.Save("UI.xml");
}
/// <summary>
/// 获取控件属性值
/// </summary>
/// <param name="ClassInstance">控件对象</param>
/// <param name="PropertyName">属性名称</param>
public object GetPropertyValue(object ClassInstance, string PropertyName)
{
Type myType = ClassInstance.GetType();
PropertyInfo myPropertyInfo = myType.GetProperty(PropertyName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
if (myPropertyInfo != null)
return myPropertyInfo.GetValue(ClassInstance, null);
else
return "";
}
/// <summary>
/// 设置控件属性值
/// </summary>
/// <param name="ClassInstance">控件对象</param>
/// <param name="PropertyName">属性名称</param>
/// <param name="PropertyValue">属性值</param>
public void SetPropertyValue(object ClassInstance, string PropertyName, object PropertyValue)
{
Type myType = ClassInstance.GetType();
PropertyInfo myPropertyInfo = myType.GetProperty(PropertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
myPropertyInfo.SetValue(ClassInstance, PropertyValue, null);
}
}
}
3.
已知有一个XML文件(bookstore.xml)如下:
<?xml version="1.0" encoding="gb2312"?>
<bookstore> <book genre="fantasy" ISBN="2-3631-4"> <title>Oberon's Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> </bookstore>
1、往<bookstore>节点中插入一个<book>节点:
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load("bookstore.xml");
XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>
XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点 xe1.SetAttribute("genre","李赞红");//设置该节点genre属性 xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性
XmlElement xesub1=xmlDoc.CreateElement("title");
xesub1.InnerText="CS从入门到精通";//设置文本节点 xe1.AppendChild(xesub1);//添加到<book>节点中 XmlElement xesub2=xmlDoc.CreateElement("author"); xesub2.InnerText="候捷"; xe1.AppendChild(xesub2); XmlElement xesub3=xmlDoc.CreateElement("price"); xesub3.InnerText="58.3"; xe1.AppendChild(xesub3);
root.AppendChild(xe1);//添加到<bookstore>节点中
xmlDoc.Save("bookstore.xml");
//===============================================
结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore> <book genre="fantasy" ISBN="2-3631-4"> <title>Oberon's Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> <book genre="李赞红" ISBN="2-3631-4"> <title>CS从入门到精通</title> <author>候捷</author> <price>58.3</price> </book> </bookstore>
2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。
XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点 //其实还可以使用这样的形式来查找某个节点 /* XmlDocument doc=new XmlDocument(); //其中a节点是二级点,cc是a下的三级节点 */ XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
foreach(XmlNode xn1 in nls)//遍历 { XmlElement xe2=(XmlElement)xn1;//转换类型 if(xe2.Name=="author")//如果找到 { xe2.InnerText="亚胜";//则修改 break;//找到退出来就可以了 } } break; } }
xmlDoc.Save("bookstore.xml");//保存。
//==================================================
最后结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore> <book genre="fantasy" ISBN="2-3631-4"> <title>Oberon's Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> <book genre="update李赞红" ISBN="2-3631-4"> <title>CS从入门到精通</title> <author>亚胜</author> <price>58.3</price> </book> </bookstore>
3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。
XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
foreach(XmlNode xn in xnl)
{ XmlElement xe=(XmlElement)xn; if(xe.GetAttribute("genre")=="fantasy") { xe.RemoveAttribute("genre");//删除genre属性 } else if(xe.GetAttribute("genre")=="update李赞红") { xe.RemoveAll();//删除该节点的全部内容 } } xmlDoc.Save("bookstore.xml");
//===========================================
最后结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore> <book ISBN="2-3631-4"> <title>Oberon's Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> <book> </book> </bookstore>
4、显示所有数据。
XmlNode xn=xmlDoc.SelectSingleNode("bookstore");
XmlNodeList xnl=xn.ChildNodes;
foreach(XmlNode xnf in xnl) { XmlElement xe=(XmlElement)xnf; Console.WriteLine(xe.GetAttribute("genre"));//显示属性值 Console.WriteLine(xe.GetAttribute("ISBN")); XmlNodeList xnf1=xe.ChildNodes; 以上文章转自 http://tb.blog.csdn.net/TrackBack.aspx?PostId=1630438
本文将会涉及3个方面的内容: while(reader.Read()) while(reader.Read()) Comment 使用<!—和-->分隔的注释 Document XML数据树的根节点 DocumentType 文档的类型声明,即<!DOCTYPE…>标记 Element 一个元素,通常是XML文件中的实际数据 在进行写入XML文件时我们使用的XmlTextWriter类,它是XmlWriter的子类,速度快且不使用缓存,但是同XmlTextReader一样,在写入XML文件时只能向前。 我们假定要写入的XML文件在C盘根目录下: XmlTextWriter writer = new XmlTextWriter("C://sample2.xml",null); 在这里如果不想把数据写入文件,而只是想在命令窗口显示,则可以把“Console.Out”作为参数传递给构造器,此时应把上述语句改为: XmlTextWriter writer = new XmlTextWriter(Console.Out); XmlTextWriter的常用方法 WriteEndDocument 使没有闭合元素闭合 writer.WriteEndDocument(); WriteEndElement 写元素的结束标志 writer.WriteEndElement(); WriteString 写入字符串 writer.WriteString("Pride And Prejudice"); 其中WriteString方法会对字符串进行下述处理: 1.字符“&”、“<”和“>”转化为“&”、“<”和“>”。 2.ASCII码为0~1F(十六进制)的字符转化为“�”~“F”。 3.如果是在写属性的值则双引号“””转化为“"”;单引号 “’”转化为“'”。
using System; writer = new XmlTextWriter (filename, null); //写XML声明 //引用样式 //Write the DocumentType node // genre 属性 //书名元素 //价格元素 //写入 CDATA //关闭根元素 //缓冲器内的内容写入文件
4..
ASP.NET对XML进行读,改,删操作代码
2008-02-03 13:30
|