如何编写或生成XML文件
如何使用C#编写或生成XML文件以获取下面的结果?如何编写或生成XML文件
<?xml version="1.0" encoding="UTF-8"?>
<pages>
<page name="Page Name 1" url="/page-1/" />
<page name="Page Name 2" url="/page-2/" />
<page name="Page Name 3" url="/page-3/" />
<page name="Page Name 4" url="/page-4/" />
</pages>
using System.Linq;
using System.Xml;
using System.Xml.Linq;
// ...
using (var writer = XmlWriter.Create("output.xml"))
new XDocument(
new XDeclaration("1.0", "UTF-8", null),
new XElement("pages",
Enumerable.Range(1, 4)
.Select(i => new XElement("page",
new XAttribute("name", "Page Name " + i),
new XAttribute("url", "/page-" + i + "/"))))
).WriteTo(writer);
我想是这样的:
System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(Server.MapPath("pages.xml"), System.Text.Encoding.UTF8);
writer.WriteStartDocument();
writer.WriteStartElement("pages");
writer.WriteStartElement("page");
writer.WriteAttributeString("name", "Page name 1");
writer.WriteAttributeString("url", "Page url 1");
writer.WriteEndElement();
writer.WriteStartElement("page");
writer.WriteAttributeString("name", "Page name 2 ");
writer.WriteAttributeString("url", "Page url 2");
writer.WriteEndElement();
writer.WriteStartElement("page");
writer.WriteAttributeString("name", "Page name 3");
writer.WriteAttributeString("url", "Page url 3");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();
由于该问题特别针对如何编写XML文档,我比“LINQ方法”(如果我可以脱口而出)更赞成这一点。如果你想查询和使用XML文档,那么Mehrdad的答案会更加相关。我猜想可以工作。 – 2009-05-25 22:09:20
如果您使用的是.NET Framework 2.0中,你应该使用XmlWriter类编写XML,否则你可以使用XmlTextWriter。
如果您使用的是.NET 3 +,则可以使用System.Xml.Linq
命名空间的XDocument类。
一个相当直接的方式可能是这样的:
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Indent = true;
using (XmlWriter writer = XmlWriter.Create(@"c:\path\file.xml", settings))
{
writer.WriteStartElement("pages");
for (int i = 1; i < 5; i++)
{
writer.WriteStartElement("page");
writer.WriteAttributeString("name", "Page Name " + i.ToString());
writer.WriteAttributeString("url", string.Format("/page-{0}/", i));
writer.WriteEndElement(); // page
}
writer.WriteEndElement(); // pages
}
给出的答案几个百分点。对于这种大小的XML文档,XDocument是处理它的相当低效的方式。至少,我了解XDocument应该用于什么。如果你在内存中处理大文档并且想用LINQ查询它们,那么XmlDocument/XDocument就是前进的方向。如果我错了,请纠正我并接受我的道歉。
其次,再次以我的理解,你的XML结构是错误的。如果我没有这个权利,请纠正我,但属性是描述元素值的元数据。它不能被用作价值本身。对于你的情况,你的结构应该是这样..
<pages>
<page>
<name href="url">Page Name 1</name>
</page>
</pages>
或者,如果你想成为真正的肛门
<pages>
<page>
<name>Page Name 1
<url>http://page/</url>
</page>
</pages>
恐怕这个答案将开辟可怕的元素VS属性辩论(这不该不存在但始终如此。)
编辑:这不是问题的直接答案;我觉得它更贴近metacomment(关于这个问题的答案的评论)。我不知道该把它放在哪里,如果它是相关的,但我认为这是值得一提的。
using System.Xml;
//...
XmlDocument xmldoc = new XmlDocument();
XmlElement pages = xmldoc.CreateElement("pages");
XmlElement page = null;
for(int i = 1; i <= 4; i++)
{
page = xmldoc.CreateElement("page");
page.SetAttribute("name", "Page Name " + i);
page.SetAttribute("url", "/page-" + i + "/");
pages.AppendChild(page);
}
xmldoc.AppendChild(xmldoc.CreateXmlDeclaration("1.0", "UTF-8", null));
xmldoc.AppendChild(pages);
xmldoc.Save("output.xml");
你也可以看看XML数据绑定。这种方法会给你看起来更像这样的代码。
Pages pages = new Pages();
for(int i=1; i<=4;i++)
{
Page p = new Page();
p.name = "Page Name " + i;
p.url = "/page-" + i + "/";
pages.Pages.Add(p);
}
Console.Write(pages.ToXml());
看一看 “A closer look at XML Data Binding”
这里也是一个很好的list of xml data binding tools
漂亮的代码:P ~~~ – jgallant 2009-05-25 23:09:35
真漂亮代码。 – crauscher 2009-05-27 10:27:42