如何使用C#编写或生成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>
答案 0 :(得分:10)
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);
答案 1 :(得分:5)
一种相当直接的方式可能是这样的:
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
}
答案 2 :(得分:3)
我猜是这样的:
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();
答案 3 :(得分:2)
如果您使用的是.NET framework 2.0,则应使用XmlWriter类编写XML,否则可以使用XmlTextWriter。
如果您使用的是.NET 3+,则可以使用System.Xml.Linq
命名空间的XDocument类。
答案 4 :(得分:1)
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");
答案 5 :(得分:0)
对答案给出了几点意见。对于那个大小的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>
我担心这个答案会打开可怕的元素与属性的争论(不应该存在,但总会存在。)
编辑:这不是问题的直接答案;我觉得它更接近一个元素(关于问题答案的评论)。如果它甚至相关,我不知道该把它放到哪里,但我认为值得一提。
答案 6 :(得分:0)
您还可以查看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