C# 建立XML文件
阿新 • • 發佈:2019-02-17
有些時候我們需要生成一個xml文件作為資料交換的容器。當然我們用拼接字串的方法來進行構建xml,但是這種方法雖然簡單有效,但是如果xml文件結構過於複雜,拼接字串會讓人眼花繚亂。這時候就需要C#給我們提供現成的類庫,以供我們自由的建立xml文件。
比如我們要建立如下的xml文件
<?xml version="1.0" encoding="UTF-8"?> <ns0:Z_AVS_UPLOAD_WEIGHT_Request xmlns:ns0="http://schemas.microsoft.com/BizTalk/2003"> <ZWERKS>ZFM1</ZWERKS> <TAB1> <ZNO>13022101</ZNO> <ZORDER>2013238955</ZORDER> <ZWEIGHT>4140</ZWEIGHT> </TAB1> <TAB1> <ZNO>13022101</ZNO> <ZORDER>2013239627</ZORDER> <ZWEIGHT>4140</ZWEIGHT> </TAB1> </ns0:Z_AVS_UPLOAD_WEIGHT_Request>
選取這樣的結構,一方面是因為它來自於論壇某位壇友實際的需求,另一方面它足夠簡單卻有代表性。
下面我將以這個例子用兩種方法(XmlDocument和Linq to XML)進行講解。
1、XmlDocument
2、Linq to XMLXmlDocument document = new XmlDocument(); XmlDeclaration declaration = document.CreateXmlDeclaration("1.0", "UTF-8", "");//xml文件的宣告部分 document.AppendChild(declaration); XmlElement root = document.CreateElement("ns0", "Z_AVS_UPLOAD_WEIGHT_Request", "http://schemas.microsoft.com/BizTalk/2003"); document.AppendChild(root); XmlElement zwerks = document.CreateElement("ZWERKS"); zwerks.InnerText = "ZFM1"; root.AppendChild(zwerks); XmlElement tab1 = document.CreateElement("TAB1"); root.AppendChild(tab1); XmlElement zno = document.CreateElement("ZNO"); zno.InnerText = "13022101"; tab1.AppendChild(zno); XmlElement zorder = document.CreateElement("ZORDER"); zorder.InnerText = "2013238955"; tab1.AppendChild(zorder); XmlElement zweight = document.CreateElement("ZWEIGHT"); zweight.InnerText = "4140"; tab1.AppendChild(zweight); XmlElement tab2 = document.CreateElement("TAB1"); root.AppendChild(tab2); XmlElement zno2 = document.CreateElement("ZNO"); zno2.InnerText = "13022101"; tab2.AppendChild(zno2); XmlElement zorder2 = document.CreateElement("ZORDER"); zorder2.InnerText = "2013238955"; tab2.AppendChild(zorder2); XmlElement zweight2 = document.CreateElement("ZWEIGHT"); zweight2.InnerText = "4140"; tab2.AppendChild(zweight2); document.Save("test.xml");//將生成好的xml儲存到test.xml檔案中
XDocument document = new XDocument(); document.Declaration = new XDeclaration("1.0", "UTF-8", ""); XNamespace ns = "http://schemas.microsoft.com/BizTalk/2003"; XElement root = new XElement(ns + "Z_AVS_UPLOAD_WEIGHT_Request", new XAttribute(XNamespace.Xmlns + "ns0", "http://schemas.microsoft.com/BizTalk/2003")); root.Add(new XElement("ZWERKS", "ZFM1"), new XElement("TAB1", new XElement("ZNO", 13022101), new XElement("ZORDER", 2013238955), new XElement("ZWEIGHT", 4140)), new XElement("TAB1", new XElement("ZNO", 13022101), new XElement("ZORDER", 2013238955), new XElement("ZWEIGHT", 4140)) ); document.Add(root); document.Save("test.xml");//儲存xml到檔案
可以發現Linq to XML的方法比較簡潔,程式碼量也足夠小。當然了XmlDocument的方法可以進一步的簡化,這裡重點展示一下Linq to XML的魅力。如上只當給需要的朋友提供一下思路和解決方案。關於Linq to xml的更多資訊可以參考:XNamespace。
————————————————————————————————————————————————————
再提供一個例子:
有a.xml:
<a>
<xingming>
<item>
<name>張三</name>
<code>1</code>
</item>
<item>
<name>李四</name>
<code>2</code>
</item>
<item>
<name>王五</name>
<code>3</code>
</item>
<item>
<name>趙四</name>
<code>4</code>
</item>
<item>
<name>王二麻子</name>
<code>5</code>
</item>
</xingming>
<nianji>
<item>
<name>一年級</name>
<banji>一班</banji>
</item>
</nianji>
</a>
想轉換成b.xml:
<b>
<xingming>
<items>
<item>
<Xingname1>張三</Xingname1>
<Xingcode1>1</Xingcode1>
<Xingname2>李四</Xingname2>
<Xingcode2>2</Xingcode2>
</item>
<item>
<Xingname1>王五</Xingname1>
<Xingcode1>3</Xingcode1>
<Xingname2>趙四</Xingname2>
<Xingcode2>4</Xingcode2>
</item>
<item>
<Xingname1>王二麻子</Xingname1>
<Xingcode1>5</Xingcode1>
</item>
</items>
</xingming>
<nianji>
<item>
<name>一年級</name>
<name>一班</name>
</item>
</nianji>
</b>
程式碼如下:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string xml = @"<a>
<xingming>
<item>
<name>張三</name>
<code>1</code>
</item>
<item>
<name>李四</name>
<code>2</code>
</item>
<item>
<name>王五</name>
<code>3</code>
</item>
<item>
<name>趙四</name>
<code>4</code>
</item>
<item>
<name>王二麻子</name>
<code>5</code>
</item>
</xingming>
<nianji>
<item>
<name>一年級</name>
<banji>一班</banji>
</item>
</nianji>
</a>";
XmlDocument newXmlDoc = new XmlDocument();
XmlElement b = newXmlDoc.CreateElement("b");
newXmlDoc.AppendChild(b);
XmlElement xingming = newXmlDoc.CreateElement("xingming");
b.AppendChild(xingming);
XmlElement items = newXmlDoc.CreateElement("items");
xingming.AppendChild(items);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
XmlElement item = null;
//直接定位到/a/xingming節點下的子節點
var nodes = xmlDoc.SelectSingleNode("/a/xingming").ChildNodes;
for (int i = 0; i < nodes.Count; i++)
{
XmlNode node = nodes.Item(i);
//節點項為偶數時,建立item節點
if (i % 2 == 0)
{
item = newXmlDoc.CreateElement("item");
items.AppendChild(item);
}
//item節點追加Xingname節點
XmlElement Xingname = newXmlDoc.CreateElement("Xingname" + (i % 2 + 1));
Xingname.InnerText = node.SelectSingleNode("name").InnerText;
item.AppendChild(Xingname);
//item節點追加Xingcode節點
XmlElement Xingcode = newXmlDoc.CreateElement("Xingcode" + (i % 2 + 1));
Xingcode.InnerText = node.SelectSingleNode("code").InnerText;
item.AppendChild(Xingcode);
}
XmlElement nianji = newXmlDoc.CreateElement("nianji");
b.AppendChild(nianji);
XmlElement item1 = newXmlDoc.CreateElement("item");
nianji.AppendChild(item1);
XmlElement name = newXmlDoc.CreateElement("name");
name.InnerText = xmlDoc.SelectSingleNode("/a/nianji/item/name").InnerText;
item1.AppendChild(name);
XmlElement banji = newXmlDoc.CreateElement("name");
banji.InnerText = xmlDoc.SelectSingleNode("/a/nianji/item/banji").InnerText;
item1.AppendChild(banji);
newXmlDoc.Save("b.xml");
}
}
}
—————————————————————————————————————————————————————————
再附一個例子,生成指定格式的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<response>
<code>0</code>
<date_list>
<godate>2017-08-09</godate>
<godate>2017-08-19</godate>
</date_list>
</response>
程式碼如下:namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
response r = new response()
{
code = 0,
date_list = new date_list()
{
godate = new string[]
{
"2017-08-09",
"2017-08-19"
}
}
};
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Indent = true;
XmlWriter writer = XmlWriter.Create("test.xml", settings);
XmlSerializer s = new XmlSerializer(typeof(response));
s.Serialize(writer, r, ns);
writer.Close();
}
}
[Serializable]
public class response
{
public int code { get; set; }
public date_list date_list { get; set; }
}
[Serializable]
public class date_list
{
[XmlElement("godate")]
public string[] godate { get; set; }
}
}