C# XML文件和XML格式字符串(string类型)的互相转换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# XML文件和XML格式字符串(string类型)的互相转换相关的知识,希望对你有一定的参考价值。
各位大神,小弟有个问题请教,希望得到各位的帮助。C#,VS2010下,我有个生成好的XML格式文件,存储路径是“E://Upload.Xml",现在我想实现将该xml格式的文件读出,把其中的内容转换成string字符串类型的,网上有个方法是”“System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.InnerXml;
doc.InnerXml是xml档的一个属性(stirng),显示的就是xml的内容字符串.”“
但是我不知道这个方法怎么与我“E://Upload.Xml"这个实际的xml文档联系起来,还请各位给出完整的代码。第二个问题是,对于xml格式的字符串,比如,<?xml version="1.0" encoding="utf-8" ?>
<custinfo>
<custname>123</custname>
<telno>456</telno>
</custinfo> ,我又怎么在c#,VS下,把它转换成“E://Dowload.Xml"形式的xml文件,也请给出完整代码。小弟不才,恳请各位帮助,若能调试成功,小弟再追加30分!
互相转换主要有两种。
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(这里是你的xml字符串);
XmlDocument xdoc = new XmlDocument();
xdoc.Load(这里是你的xml文件)。
string是C++、java等编程语言中的字符串。String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。
String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.
xdoc.LoadXml(这里是你的xml字符串);
或者
XmlDocument xdoc = new XmlDocument();
xdoc.Load(这里是你的xml文件);
然后
xdoc.InnerXml 是你的xml字符串
xdoc.Save(这里是你的xml文件)追问
”xdoc.InnerXml “报错了,它说只有assignment、call、increment和new对象表达式可用作语句。还有,我要使用这个string型的字符串,是用xdoc还是用innerxml??
追答我再说清楚一点吧。
XmlDocument是一个类型,用来代表Xml文档。
它可以从字符串生成,也可以从文件读入;(两种方式输入)
它可以生成字符串,也可以存入文件。(两种方式输出)
你要用字符串的话,就
string strXml = xdoc.InnerXml; 然后对strXml干你要干的事
恩恩,能调了,最后一个问题,如果我想在LoadXml里放我的xml字符串,
123
456
它说我有换行符,要报错,我应该怎么做?取消格式、间隔?
xdoc.LoadXml(@"
123
456
");
字符串前面加上@以后里面就可以写换行符了
我看网上说”C#使用LoadXML要求传入的字符串必须为UTF-16编码“,我这是UTF-8编码啊?怎么 弄啊?而是加了@还是报错,”只有assignment、call、increment和new对象表达式可用作语句“
追答你到底干了什么……能贴一下代码或者代码截图吗?调用LoadXML那里的
追问我就把一个xml文件的内容完完全全粘贴进去,再加了个”“和一个@啊,其他的什么也没干啊!
还有网上说”C#使用LoadXML要求传入的字符串必须为UTF-16编码“,我这是UTF-8编码,怎么改啊??
直接贴到源代码里面的话和编码没有关系啊
所以还是想看一下你代码里面是什么样的,这样最直接
调好了,非常感谢你!你能留下你的扣扣吗
本回答被提问者采纳 参考技术B 注意xml字符串中的"用 @定义字符串的时候 " 要变 ""
例
string xml=@"<?xml version=""1.0"" encoding=""utf-8"" ?>
<custinfo>
<custname>123</custname>
<telno>456</telno>
</custinfo>";
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xml);
编码什么的不知道你从哪里看的, 你的xml头部声明中已经声明了 encoding="utf-8" 了 为什么要用urf16?
建议自己试一下
C#读取XML文件的基类实现
刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node.Attribute(name)方法,因此,想到结合之前所做的XML操作,完成了一个能够读取XML文件的基类,便于以后的使用。
PS:即使再老套的代码,目前也不敢进行优化,一是水平不行,二是不敢。
使用静态扩展类,扩展了几个经常使用的类型,能够方便数据的读写。
操作XML的类,可以直接继承BaseLinqXmlFileInfo,只需要设置protected类型的变量mPathName,mFileName,然后重写抽象方法即可实现XML文档的读取操作。
PS:能力有限,有不对之处请指正,谢谢。
1 using System; 2 using System.IO; 3 using System.Xml.Linq; 4 5 namespace Common 6 { 7 public abstract class BaseLinqXmlFileInfo 8 { 9 protected string mPathName; 10 11 protected string mFileName; 12 13 protected virtual string PathName 14 { 15 get { return mPathName; } 16 set { mPathName = value; } 17 } 18 19 protected virtual string FileName 20 { 21 get { return mFileName; } 22 set { mFileName = value; } 23 } 24 25 protected virtual string FilePathName 26 { 27 get 28 { 29 return Path.Combine(PathName, FileName); 30 } 31 } 32 33 public virtual bool Load() 34 { 35 bool result = false; 36 try 37 { 38 string filePathName = this.FilePathName; 39 if (File.Exists(filePathName)) 40 { 41 this.LoadDocument(filePathName); 42 result = true; 43 } 44 } 45 catch(Exception ex) 46 { 47 //异常信息输出 48 } 49 return result; 50 } 51 52 public virtual bool Save() 53 { 54 bool result = false; 55 try 56 { 57 58 string pathName = this.PathName; 59 if (!Directory.Exists(pathName)) 60 { 61 Directory.CreateDirectory(PathName); 62 } 63 string tempFileName = "~" + FileName; 64 string tempfilePathName = Path.Combine(pathName, tempFileName); 65 this.SaveDocument(tempfilePathName); 66 string filePathName = Path.Combine(PathName, FileName); 67 if (File.Exists(filePathName)) 68 { 69 FileAttributes att = File.GetAttributes(filePathName); 70 if((att & FileAttributes.ReadOnly)== FileAttributes.ReadOnly) 71 { 72 File.SetAttributes(filePathName, att & ~FileAttributes.ReadOnly); 73 } 74 } 75 File.Copy(tempfilePathName, filePathName, true); 76 if (File.Exists(tempfilePathName)) 77 { 78 File.Delete(tempfilePathName); 79 } 80 result = true; 81 } 82 catch (Exception ex) 83 { 84 //异常信息输出 85 } 86 return result; 87 } 88 89 private void LoadDocument(string fileName) 90 { 91 try 92 { 93 XDocument doc = XDocument.Load(fileName); 94 this.ReadXml(doc); 95 } 96 catch(Exception ex) 97 { 98 //异常信息输出 99 } 100 } 101 102 private void SaveDocument(string fileName) 103 { 104 try 105 { 106 XDocument doc = new XDocument(); 107 this.WriteXml(doc); 108 doc.Save(fileName); 109 } 110 catch(Exception ex) 111 { 112 //异常信息输出 113 } 114 } 115 116 private void ReadXml(XDocument doc) 117 { 118 XElement root = doc.Root; 119 this.ReadXml(root); 120 } 121 122 private void WriteXml(XDocument doc) 123 { 124 XElement root = new XElement("root"); 125 doc.Add(root); 126 this.WriteXml(root); 127 } 128 129 protected abstract void ReadXml(XElement node); 130 131 protected abstract void WriteXml(XElement node); 132 } 133 134 public static class XMLSerializeExtensionClass 135 { 136 public static void Write(this XElement node,string name,string value) 137 { 138 node.SetAttributeValue(name, value); 139 } 140 141 public static string ReadString(this XElement node, string name, string defaultValue) 142 { 143 XAttribute att = node.Attribute(name); 144 return att != null ? att.Value : defaultValue; 145 } 146 147 public static void Write(this XElement node,string name,long value) 148 { 149 node.SetAttributeValue(name, value); 150 } 151 152 public static long ReadLong(this XElement node,string name,long defaultValue) 153 { 154 XAttribute att = node.Attribute(name); 155 return att != null ? Convert.ToInt64(att.Value) : defaultValue; 156 } 157 158 public static void Write(this XElement node,string name,decimal value) 159 { 160 node.SetAttributeValue(name, value); 161 } 162 163 public static decimal ReadDecimal(this XElement node,string name,decimal defaultValue) 164 { 165 XAttribute att = node.Attribute(name); 166 return att != null ? Convert.ToDecimal(att.Value) : defaultValue; 167 } 168 169 public static void Write(this XElement node ,string name,DateTime value) 170 { 171 node.SetAttributeValue(name, value); 172 } 173 174 public static DateTime ReadDateTime(this XElement node,string name,DateTime defaultValue) 175 { 176 XAttribute att = node.Attribute(name); 177 return att != null ? Convert.ToDateTime(att.Value) : defaultValue; 178 } 179 180 public static void Write(this XElement node,string name,int value) 181 { 182 node.SetAttributeValue(name, value); 183 } 184 185 public static int ReadInt(this XElement node,string name,int defaultValue) 186 { 187 XAttribute att = node.Attribute(name); 188 return att != null ? Convert.ToInt32(att.Value) : defaultValue; 189 } 190 191 public static void Write(this XElement node, string name,bool value) 192 { 193 node.SetAttributeValue(name, value); 194 } 195 196 public static bool ReadBoolean(this XElement node, string name, bool defaultValue) 197 { 198 XAttribute att = node.Attribute(name); 199 return att != null ? Convert.ToBoolean(att.Value) : defaultValue; 200 } 201 } 202 }
以上是关于C# XML文件和XML格式字符串(string类型)的互相转换的主要内容,如果未能解决你的问题,请参考以下文章
C#如何将xml数据转换成Array类型或者集合类?多谢!!!