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的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.

参考技术A XmlDocument xdoc = new XmlDocument();
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文件

C#如何将xml数据转换成Array类型或者集合类?多谢!!!

C#中将一个XML格式的字符串序列化成实体类 报DateTime类型错误 请高手指点一下

C#里如何将XML格式字符串转成XML文件?

C# linq to Xml(复习用)

c# 如何将string转化为xml形式 再读取想要的节点