想用XML保存某一个treeview的所有内容,但是xml里又不允许一些特殊字符,如何解决? 晕死。这种xml格式 怎么能行的通。 node节点一般都定义成英文。比如:<Document value="2014年工作文档"></Document> 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我把全部代码贴出来吧,刚做这个不是太明白,请您详细指点一下可以么?namespace test_xml_treeview{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private TreeView thetreeview; private string xmlfilepath; XmlTextWriter textWriter; XmlNode Xmlroot; XmlDocument textdoc = new XmlDocument(); private void button1_Click(object sender, EventArgs e) //将treeview存入xml { thetreeview = treeView1; xmlfilepath = @"F:\jzd\test_xml treeview\test_xml treeview\xml1.xml"; textWriter = new XmlTextWriter(xmlfilepath, null); textWriter.Formatting = Formatting.Indented; textWriter.WriteStartDocument(); textWriter.WriteComment("this XML is created from a tree"); textWriter.WriteStartElement("根节点"); textWriter.WriteEndElement(); textWriter.WriteEndDocument(); textWriter.Close(); textdoc.Load(xmlfilepath); XmlElement Xmlnode = textdoc.CreateElement(thetreeview.Nodes[0].Text); Xmlroot = textdoc.SelectSingleNode("根节点"); TransTreeSav(thetreeview.Nodes, (XmlElement)Xmlroot); } int TransTreeSav(TreeNodeCollection nodes, XmlElement ParXmlnode) { //-------遍历树的各个故障节点,同时添加节点至XML XmlElement xmlnode; Xmlroot = textdoc.SelectSingleNode("根节点"); foreach (TreeNode node in nodes) { xmlnode = textdoc.CreateElement(node.Text); ParXmlnode.AppendChild(xmlnode); if (node.Nodes.Count > 0) { TransTreeSav(node.Nodes, xmlnode); } } textdoc.Save(xmlfilepath); return 0; } private void button2_Click(object sender, EventArgs e) //读取xml文件 { thetreeview = treeView1; xmlfilepath = @"F:\jzd\test_xml treeview\test_xml treeview\xml1.xml"; textdoc.Load(xmlfilepath); XmlNode root = textdoc.SelectSingleNode("根节点");//读的xml的节点名 foreach (XmlNode subXmlnod in root.ChildNodes) { TreeNode trerotnod = new TreeNode(); trerotnod.Text = subXmlnod.Name; thetreeview.Nodes.Add(trerotnod); TransXML(subXmlnod.ChildNodes, trerotnod); } } int TransXML(XmlNodeList Xmlnodes, TreeNode partrenod) { //------遍历XML中的所有节点,仿照treeview节点遍历函数 foreach (XmlNode xmlnod in Xmlnodes) { TreeNode subtrnod = new TreeNode(); subtrnod.Text = xmlnod.Name + xmlnod.Value; partrenod.Nodes.Add(subtrnod); if (xmlnod.ChildNodes.Count > 0) { TransXML(xmlnod.ChildNodes, subtrnod); } } return 0; } }} 可以请您详细说明一下么?刚做这个不是太明白,下面是代码:namespace test_xml_treeview{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private TreeView thetreeview; private string xmlfilepath; XmlTextWriter textWriter; XmlNode Xmlroot; XmlDocument textdoc = new XmlDocument(); private void button1_Click(object sender, EventArgs e) //将treeview存入xml { thetreeview = treeView1; xmlfilepath = @"F:\jzd\test_xml treeview\test_xml treeview\xml1.xml"; textWriter = new XmlTextWriter(xmlfilepath, null); textWriter.Formatting = Formatting.Indented; textWriter.WriteStartDocument(); textWriter.WriteComment("this XML is created from a tree"); textWriter.WriteStartElement("根节点"); textWriter.WriteEndElement(); textWriter.WriteEndDocument(); textWriter.Close(); textdoc.Load(xmlfilepath); XmlElement Xmlnode = textdoc.CreateElement(thetreeview.Nodes[0].Text); Xmlroot = textdoc.SelectSingleNode("根节点"); TransTreeSav(thetreeview.Nodes, (XmlElement)Xmlroot); } int TransTreeSav(TreeNodeCollection nodes, XmlElement ParXmlnode) { //-------遍历树的各个故障节点,同时添加节点至XML XmlElement xmlnode; Xmlroot = textdoc.SelectSingleNode("根节点"); foreach (TreeNode node in nodes) { xmlnode = textdoc.CreateElement(node.Text); ParXmlnode.AppendChild(xmlnode); if (node.Nodes.Count > 0) { TransTreeSav(node.Nodes, xmlnode); } } textdoc.Save(xmlfilepath); return 0; } private void button2_Click(object sender, EventArgs e) //读取xml文件 { thetreeview = treeView1; xmlfilepath = @"F:\jzd\test_xml treeview\test_xml treeview\xml1.xml"; textdoc.Load(xmlfilepath); XmlNode root = textdoc.SelectSingleNode("根节点");//读的xml的节点名 foreach (XmlNode subXmlnod in root.ChildNodes) { TreeNode trerotnod = new TreeNode(); trerotnod.Text = subXmlnod.Name; thetreeview.Nodes.Add(trerotnod); TransXML(subXmlnod.ChildNodes, trerotnod); } } int TransXML(XmlNodeList Xmlnodes, TreeNode partrenod) { //------遍历XML中的所有节点,仿照treeview节点遍历函数 foreach (XmlNode xmlnod in Xmlnodes) { TreeNode subtrnod = new TreeNode(); subtrnod.Text = xmlnod.Name + xmlnod.Value; partrenod.Nodes.Add(subtrnod); if (xmlnod.ChildNodes.Count > 0) { TransXML(xmlnod.ChildNodes, subtrnod); } } return 0; } }} 意思是把你的xml文件格式修改一下,至于怎么读取,你还需要修改代码的。或者使用linq to xml 文件 进行xml文件的操作。http://blog.csdn.net/duanzi_peng/article/details/24018431 <2014年工作文档 /> 这是xml标签中包含中文。需要xml支持中文标签。1.<?xml version="1.0" encoding="gb2312" ?> 声明编码方式为gb2312或者utf-8。用xml encoding就可以设定字符集。但是所设定的字符集必须与你文件所使用的字符集对应。有很多人设定了某种encoding(例如GB2312),但文件本身实际上是以另外的编码方式(例如Unicode)保存,就会出现错误。强烈建议使用UTF-8来保存带有中文字符的XML。如果要使用本地字符集,建议优先使用GB18030(即2000年的新的取代gb2312的国家标准)。但是注意是否支持中文标签,还取决于你所使用的xml工具包,例如有些xml parser就不支持中文标签但可以包含中文数据。2.建立一个映射,用英文标签和中文标签建立一个一对一映射。进行一个转换。如果node节点内的字符串包含很多特殊字符,可以使用CDATA[]把整段字符串包含进去,里面的所有的字符(包含特殊字符)都会直接被存储和解析,不会发生转义。 Quote: 引用 6 楼 zhi_ai_yaya 的回复:如果node节点内的字符串包含很多特殊字符,可以使用CDATA[]把整段字符串包含进去,里面的所有的字符(包含特殊字符)都会直接被存储和解析,不会发生转义。[/quote]这个不太明白,可否详细举个例子?谢谢! 刚测试了一下由代码创建的表保存的文件,创建2个列分别为2014年记事\2000年记事,写入的内容分别是2014年记事内容\2000年记事内容,打开保存的XML文件发现自动保存内容如下: <?xml version="1.0" standalone="true"?>-<DocumentElement>-<定义列创建的表><_x0032_014年记事>2014年记事内容</_x0032_014年记事><_x0032_000年记事>2000年记事内容</_x0032_000年记事></定义列创建的表><定义列创建的表/></DocumentElement>读取和保存均正常参考代码http://blog.csdn.net/xianfajushi/article/details/11742249 CDATA的定义,可以参考下百度百科:CDATA形式:<![CDATA[文本内容]]>里面有个例子:转义字符编辑非法的 XML 字符必须被替换为实体引用(entity reference)。假如您在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。因此你不能这样写:<message>if salary < 1000 then</message>为了避免此类错误,需要把字符 "<" 替换为实体引用,就像这样:<message>if salary < 1000 then</message>如果在<message></message>之间包含很多的< > , ' ",每个都要转义,很麻烦,就用CDATA括起来,就像这样:<script><![CDATA[function matchwo(a,b){if (a < b && a < 0) then { return 1; }else { return 0; }}]]></script>红色部分的内容,将作为一个字符串值,成为<scrit></script>这个标签的value。 分享.NET学习资源: 对IEnumerable<T>如何理解? C#结构体中数组怎么实例化 C#中SQLHelper 常用查询的用法和区别 求解 C# XM文件怎么序列化啊?急………… 请教高手,得到QQ游戏厅里下到本地端的QQ在线号码! 跪求,关于事务急 关于ComboBox的数据绑定的问题? 存储过程指定的参数过多的问题如何解决? Delphi写的dll中的函数,转成C#中声明怎么写? 怎样保持在tabcontrol控件上画的画? Http协议IPCamera访问问题
我把全部代码贴出来吧,刚做这个不是太明白,请您详细指点一下可以么?namespace test_xml_treeview
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private TreeView thetreeview;
private string xmlfilepath;
XmlTextWriter textWriter;
XmlNode Xmlroot;
XmlDocument textdoc = new XmlDocument(); private void button1_Click(object sender, EventArgs e) //将treeview存入xml
{
thetreeview = treeView1;
xmlfilepath = @"F:\jzd\test_xml treeview\test_xml treeview\xml1.xml";
textWriter = new XmlTextWriter(xmlfilepath, null);
textWriter.Formatting = Formatting.Indented;
textWriter.WriteStartDocument();
textWriter.WriteComment("this XML is created from a tree");
textWriter.WriteStartElement("根节点");
textWriter.WriteEndElement();
textWriter.WriteEndDocument();
textWriter.Close();
textdoc.Load(xmlfilepath);
XmlElement Xmlnode = textdoc.CreateElement(thetreeview.Nodes[0].Text);
Xmlroot = textdoc.SelectSingleNode("根节点");
TransTreeSav(thetreeview.Nodes, (XmlElement)Xmlroot);
} int TransTreeSav(TreeNodeCollection nodes, XmlElement ParXmlnode)
{
//-------遍历树的各个故障节点,同时添加节点至XML
XmlElement xmlnode;
Xmlroot = textdoc.SelectSingleNode("根节点");
foreach (TreeNode node in nodes)
{
xmlnode = textdoc.CreateElement(node.Text);
ParXmlnode.AppendChild(xmlnode); if (node.Nodes.Count > 0)
{
TransTreeSav(node.Nodes, xmlnode);
}
}
textdoc.Save(xmlfilepath);
return 0;
} private void button2_Click(object sender, EventArgs e) //读取xml文件
{
thetreeview = treeView1;
xmlfilepath = @"F:\jzd\test_xml treeview\test_xml treeview\xml1.xml";
textdoc.Load(xmlfilepath);
XmlNode root = textdoc.SelectSingleNode("根节点");//读的xml的节点名
foreach (XmlNode subXmlnod in root.ChildNodes)
{
TreeNode trerotnod = new TreeNode();
trerotnod.Text = subXmlnod.Name;
thetreeview.Nodes.Add(trerotnod);
TransXML(subXmlnod.ChildNodes, trerotnod);
}
}
int TransXML(XmlNodeList Xmlnodes, TreeNode partrenod)
{
//------遍历XML中的所有节点,仿照treeview节点遍历函数
foreach (XmlNode xmlnod in Xmlnodes)
{
TreeNode subtrnod = new TreeNode();
subtrnod.Text = xmlnod.Name + xmlnod.Value;
partrenod.Nodes.Add(subtrnod); if (xmlnod.ChildNodes.Count > 0)
{
TransXML(xmlnod.ChildNodes, subtrnod);
}
}
return 0;
}
}
}
可以请您详细说明一下么?刚做这个不是太明白,下面是代码:namespace test_xml_treeview
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private TreeView thetreeview;
private string xmlfilepath;
XmlTextWriter textWriter;
XmlNode Xmlroot;
XmlDocument textdoc = new XmlDocument(); private void button1_Click(object sender, EventArgs e) //将treeview存入xml
{
thetreeview = treeView1;
xmlfilepath = @"F:\jzd\test_xml treeview\test_xml treeview\xml1.xml";
textWriter = new XmlTextWriter(xmlfilepath, null);
textWriter.Formatting = Formatting.Indented;
textWriter.WriteStartDocument();
textWriter.WriteComment("this XML is created from a tree");
textWriter.WriteStartElement("根节点");
textWriter.WriteEndElement();
textWriter.WriteEndDocument();
textWriter.Close();
textdoc.Load(xmlfilepath);
XmlElement Xmlnode = textdoc.CreateElement(thetreeview.Nodes[0].Text);
Xmlroot = textdoc.SelectSingleNode("根节点");
TransTreeSav(thetreeview.Nodes, (XmlElement)Xmlroot);
} int TransTreeSav(TreeNodeCollection nodes, XmlElement ParXmlnode)
{
//-------遍历树的各个故障节点,同时添加节点至XML
XmlElement xmlnode;
Xmlroot = textdoc.SelectSingleNode("根节点");
foreach (TreeNode node in nodes)
{
xmlnode = textdoc.CreateElement(node.Text);
ParXmlnode.AppendChild(xmlnode); if (node.Nodes.Count > 0)
{
TransTreeSav(node.Nodes, xmlnode);
}
}
textdoc.Save(xmlfilepath);
return 0;
} private void button2_Click(object sender, EventArgs e) //读取xml文件
{
thetreeview = treeView1;
xmlfilepath = @"F:\jzd\test_xml treeview\test_xml treeview\xml1.xml";
textdoc.Load(xmlfilepath);
XmlNode root = textdoc.SelectSingleNode("根节点");//读的xml的节点名
foreach (XmlNode subXmlnod in root.ChildNodes)
{
TreeNode trerotnod = new TreeNode();
trerotnod.Text = subXmlnod.Name;
thetreeview.Nodes.Add(trerotnod);
TransXML(subXmlnod.ChildNodes, trerotnod);
}
}
int TransXML(XmlNodeList Xmlnodes, TreeNode partrenod)
{
//------遍历XML中的所有节点,仿照treeview节点遍历函数
foreach (XmlNode xmlnod in Xmlnodes)
{
TreeNode subtrnod = new TreeNode();
subtrnod.Text = xmlnod.Name + xmlnod.Value;
partrenod.Nodes.Add(subtrnod); if (xmlnod.ChildNodes.Count > 0)
{
TransXML(xmlnod.ChildNodes, subtrnod);
}
}
return 0;
}
}
}
或者使用linq to xml 文件 进行xml文件的操作。
http://blog.csdn.net/duanzi_peng/article/details/24018431
这是xml标签中包含中文。需要xml支持中文标签。1.<?xml version="1.0" encoding="gb2312" ?> 声明编码方式为gb2312或者utf-8。
用xml encoding就可以设定字符集。但是所设定的字符集必须与你文件所使用的字符集对应。有很多人设定了某种encoding(例如GB2312),但文件本身实际上是以另外的编码方式(例如Unicode)保存,就会出现错误。强烈建议使用UTF-8来保存带有中文字符的XML。如果要使用本地字符集,建议优先使用GB18030(即2000年的新的取代gb2312的国家标准)。但是注意是否支持中文标签,还取决于你所使用的xml工具包,例如有些xml parser就不支持中文标签但可以包含中文数据。2.建立一个映射,用英文标签和中文标签建立一个一对一映射。进行一个转换。如果node节点内的字符串包含很多特殊字符,可以使用CDATA[]把整段字符串包含进去,里面的所有的字符(包含特殊字符)都会直接被存储和解析,不会发生转义。
<?xml version="1.0" standalone="true"?>-<DocumentElement>
-<定义列创建的表><_x0032_014年记事>2014年记事内容</_x0032_014年记事><_x0032_000年记事>2000年记事内容</_x0032_000年记事></定义列创建的表><定义列创建的表/></DocumentElement>
读取和保存均正常
参考代码http://blog.csdn.net/xianfajushi/article/details/11742249
形式:
<![CDATA[文本内容]]>
里面有个例子:
转义字符
编辑非法的 XML 字符必须被替换为实体引用(entity reference)。
假如您在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。因此你不能这样写:
<message>if salary < 1000 then</message>为了避免此类错误,需要把字符 "<" 替换为实体引用,就像这样:
<message>if salary < 1000 then</message>如果在<message></message>之间包含很多的< > , ' ",每个都要转义,很麻烦,就用CDATA括起来,就像这样:
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}]]>
</script>
红色部分的内容,将作为一个字符串值,成为<scrit></script>这个标签的value。