在 C# 中生成 XML(使用从 XSD 生成的 class)
Generating XML in C# ( using a class generated from XSD)
我正在尝试使用 C# 生成 .xml
文件。为此,我正在使用从 XSD 生成的 class。
准确地说,我正在用 Nunit results.xsd
做一些实验。
我需要多次生成一些元素。我在每个函数的末尾都有以下代码
var serializer = new XmlSerializer(typeof(resultType));
using (var stream = new StreamWriter(@"C:\test.xml",true))
serializer.Serialize(stream, data);
当我多次执行此操作时,我看到每次都附加 XML 版本和编码的 xml
标签。
如何将它们作为单独的函数放置,以便我可以多次调用这些对象来创建多个相同类型的 XML 元素,并最终将 XML 与数据一起保存?我需要生成的文件具有类似于 Nunit 结果的结构 XML 文件。
编辑;
我们使用 "proxy" class 在不改变现有方案的情况下改变结果。
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
namespace Tool.Cons
{
class Result
{
[XmlElement("test-suite")]
public testsuiteType[] testsuite { get; set; }
/// <remarks/>
[XmlAttribute()]
public string name { get; set; }
/// <remarks/>
[XmlAttribute()]
public decimal total { get; set; }
/// <remarks/>
[XmlAttribute()]
public decimal failures { get; set; }
/// <remarks/>
[XmlAttribute("not-run")]
public decimal notrun { get; set; }
/// <remarks/>
[XmlAttribute()]
public string date { get; set; }
/// <remarks/>
[XmlAttribute()]
public string time { get; set; }
}
class Program
{
static void AppendTestSuite(XDocument xdocument, testsuiteType suite)
{
var ser = new XmlSerializer(typeof(testsuiteType));
using (var writer = xdocument.Root.CreateWriter())
{
// We need this for some reason...
writer.WriteWhitespace("");
ser.Serialize(writer, suite);
}
}
static void Main(string[] args)
{
var res = GetTestResult();
var xdoc = new XDocument();
// Create the root element.
using (var writer = xdoc.CreateWriter())
ser.Serialize(writer, res);
// For testing purposes:
AppendTestSuite(xdoc, res.testsuite);
var _out = xdoc.ToString();
}
}
}
您可以 运行 xsd.exe(在 Microsoft SDK 文件夹中)使用开关 /c <path to xsd>
为您生成强类型 class。在很多情况下它是完美的。然而!!创建的结构不是您每天 class 的构建经验。 class构造比较奇葩,使用时请注意。
我正在尝试使用 C# 生成 .xml
文件。为此,我正在使用从 XSD 生成的 class。
准确地说,我正在用 Nunit results.xsd
做一些实验。
我需要多次生成一些元素。我在每个函数的末尾都有以下代码
var serializer = new XmlSerializer(typeof(resultType));
using (var stream = new StreamWriter(@"C:\test.xml",true))
serializer.Serialize(stream, data);
当我多次执行此操作时,我看到每次都附加 XML 版本和编码的 xml
标签。
如何将它们作为单独的函数放置,以便我可以多次调用这些对象来创建多个相同类型的 XML 元素,并最终将 XML 与数据一起保存?我需要生成的文件具有类似于 Nunit 结果的结构 XML 文件。
编辑; 我们使用 "proxy" class 在不改变现有方案的情况下改变结果。
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
namespace Tool.Cons
{
class Result
{
[XmlElement("test-suite")]
public testsuiteType[] testsuite { get; set; }
/// <remarks/>
[XmlAttribute()]
public string name { get; set; }
/// <remarks/>
[XmlAttribute()]
public decimal total { get; set; }
/// <remarks/>
[XmlAttribute()]
public decimal failures { get; set; }
/// <remarks/>
[XmlAttribute("not-run")]
public decimal notrun { get; set; }
/// <remarks/>
[XmlAttribute()]
public string date { get; set; }
/// <remarks/>
[XmlAttribute()]
public string time { get; set; }
}
class Program
{
static void AppendTestSuite(XDocument xdocument, testsuiteType suite)
{
var ser = new XmlSerializer(typeof(testsuiteType));
using (var writer = xdocument.Root.CreateWriter())
{
// We need this for some reason...
writer.WriteWhitespace("");
ser.Serialize(writer, suite);
}
}
static void Main(string[] args)
{
var res = GetTestResult();
var xdoc = new XDocument();
// Create the root element.
using (var writer = xdoc.CreateWriter())
ser.Serialize(writer, res);
// For testing purposes:
AppendTestSuite(xdoc, res.testsuite);
var _out = xdoc.ToString();
}
}
}
您可以 运行 xsd.exe(在 Microsoft SDK 文件夹中)使用开关 /c <path to xsd>
为您生成强类型 class。在很多情况下它是完美的。然而!!创建的结构不是您每天 class 的构建经验。 class构造比较奇葩,使用时请注意。