我怎样才能有条件地以一种不那么冗长的方式写出XML
本文关键字:一种 XML 方式写 有条件 | 更新日期: 2023-09-27 18:29:26
我想用C#编写一个xml文件。这是一个基本的文件:
<EmployeeConfiguration>
<Bosses>
<Boss name="BOB">
<Employees>
<Employee Id="#0001" />
<Employee Id="#0002" />
</Employees>
<Boss>
</Bosses>
</EmployeeConfiguration>
如果没有CCD_ 2节点,我就不想有CCD_。。。
我想使用XElement,但我不能,因为。。。所以我使用了XmlWriter。它运行良好,但我发现编写XML:非常冗长
EmployeeConfiguration config = EmployeeConfiguration.GetConfiguration();
using (XmlWriter writer = XmlWriter.Create(_fileUri, settings))
{
writer.WriteStartDocument();
// <EmployeeConfiguration>
writer.WriteStartElement("EmployeeConfiguration");
if (config.Bosses.Count > 0)
{
// <Bosses>
writer.WriteStartElement("Bosses");
foreach (Boss b in config.Bosses)
{
// Boss
writer.WriteStartElement("Boss");
writer.WriteStartAttribute("name");
writer.WriteString(b.Name);
writer.WriteEndAttribute();
if (b.Employees.Count > 0)
{
writer.WriteStartElement("Employees");
foreach (Employee emp in b.Employees)
{
writer.WriteStartElement(Employee);
writer.WriteStartAttribute(Id);
writer.WriteString(emp.Id);
writer.WriteEndAttribute();
writer.WriteEndElement();
}
}
}
}
}
有没有其他(也是最快的)方法来编写这种xml文件?
如果你的意思是"最快"是写一些代码的最快方式(也是最简单的方式),那么创建一个自定义类并使用XmlSerializer序列化它就是最好的方法。。。
创建你的类如下:
[XmlRoot("EmployeeConfiguration")]
public class EmployeeConfiguration
{
[XmlArray("Bosses")]
[XmlArrayItem("Boss")]
public List<Boss> Bosses { get; set; }
}
public class Boss
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlArray("Employees")]
[XmlArrayItem("Employee")]
public List<Employee> Employees { get; set; }
}
public class Employee
{
[XmlAttribute]
public string Id { get; set; }
}
然后你可以用这个来序列化这些:
// create a serializer for the root type above
var serializer = new XmlSerializer(typeof (EmployeeConfiguration));
// by default, the serializer will write out the "xsi" and "xsd" namespaces to any output.
// you don't want these, so this will inhibit it.
var namespaces = new XmlSerializerNamespaces(new [] { new XmlQualifiedName("", "") });
// serialize to stream or writer
serializer.Serialize(outputStreamOrWriter, config, namespaces);
正如您所看到的,在类上使用各种属性可以指示序列化程序如何序列化类。我上面包含的一些设置实际上是默认设置,不需要明确说明,但我包含它们是为了向您展示它是如何做到的。
您可能需要查看XML序列化,使用XmlElement、XmlAttribute(等等)属性。我认为这为您提供了所需的控制级别,并提供了一个非常快速、安全且易于维护的调用来进行XML转换。
var xml = new XElement("EmployeeConfiguration",
new XElement("Bosses"),
new XElement("Boss", new XAttribute("name", "BOB"),
new XElement("Employees"),
new XElement("Employee", new XAttribute("Id", "#0001")),
new XElement("Employee", new XAttribute("Id", "#0001"))
)
);