C# 使用硬编码模式C创建XmlDocument#
我有一个使用XML文件的应用程序。如果xml文件存在,效果会很好,但是也有一个要求,即项目生成一个空白xml文件,然后在输出文件不存在的情况下写入该文件 xml文件有一个相当复杂的模式,如下所示:C# 使用硬编码模式C创建XmlDocument#,c#,xml,xml-generation,C#,Xml,Xml Generation,我有一个使用XML文件的应用程序。如果xml文件存在,效果会很好,但是也有一个要求,即项目生成一个空白xml文件,然后在输出文件不存在的情况下写入该文件 xml文件有一个相当复杂的模式,如下所示: <?xml version="1.0" encoding="UTF-8"?> <Results> <Result> <WorkorderId>45</WorkorderId> <WorkerId&
<?xml version="1.0" encoding="UTF-8"?>
<Results>
<Result>
<WorkorderId>45</WorkorderId>
<WorkerId>13</WorkerId>
<DeviceId>38954178</DeviceId>
<Latitude>45.234</Latitude>
<Longitude>19.54</Longitude>
<Note>[all is good]</Note>
<Operations>
<Operation>
<OperationId>23</OperationId>
<Result>Success</Result>
<ParsedInformation>
<Info>parsed data</Info>
<Info>more parsed data</Info>
</ParsedInformation>
</Operation>
<!-- more operations ... -->
</Operations>
</Result>
<!-- more results ... -->
</Results>
45
13
38954178
45.234
19.54
[一切都很好]
23
成功
包括解析数据
更多解析数据
我想知道如何创建这样的XmlDocument,以便将结果写入其中?在项目中某处对模式进行硬编码是否有“最佳实践”等
请注意,我是Xml新手,因此欢迎提供任何其他信息/文献。据我所知,您必须逐个节点构建文档。也许您可以将空树保存为模板。据我所知,您必须逐个节点构建文档。也许您可以将空树保存为模板。如果您的文档格式实际上有一个XML模式,那么您可以使用
xsd.exe
实用程序为它生成一组与XmlSerializer
兼容的类-元素变成类,它们的属性和子元素变成属性,元素序列成为集合,等等。只要您的模式定义了正确的类型,您也将获得正确的类型(即xs:int
变为int
,等等)。然后,您可以使用这些类在内存中构建对象树,并使用XmlSerializer
对其进行序列化。如果您的文档格式实际上有一个XML模式,那么您可以使用xsd.exe
实用程序为它生成一组与XmlSerializer
兼容的类-元素变成类,它们的属性和子元素成为属性,元素序列成为集合,等等。只要您的模式定义了正确的类型,您也将获得正确的类型(即xs:int
变为int
,等等)。然后,您可以使用这些类在内存中构建对象树,并使用XmlSerializer
对其进行序列化。我通常会创建一组包含数据的类,并使用适当的XmlSerializer属性标记它们,以确保它们被序列化为您期望的格式。这是一个很好的资源:
在您的情况下,您将拥有以下类(未测试):
显然,您还可以将数据从字符串反序列化到对象
请注意,如果您的xml具有XSD架构,则可以使用XSD.exe工具为您生成代码。我通常会创建一组包含数据的类,并使用适当的XmlSerializer属性标记它们,以确保它们被序列化为您期望的格式。这是一个很好的资源: 在您的情况下,您将拥有以下类(未测试): 显然,您还可以将数据从字符串反序列化到对象 请注意,如果您的xml具有XSD模式,则可以使用XSD.exe工具为您生成代码
[XmlRoot("Results")]
public class Results
{
List<Result> results = new List<Result>();
[XmlElement("Result")]
List<Result> Results {get{return results;}}
}
public class Result
{
List<Operation> operations = new List<Operation>();
int WorkorderId {get; set;}
.... other fields
string Note{get;set;}
List<Operation> Operations {get{return operations;}}
}
public class Operation
{
List<string> parsedInformation = new List<string>();
int OperationId {get;set;}
....
[XmlArray("ParsedInformation")]
[XmlArrayItem("Info")]
List<string> ParsedInformation{get{return parsedInformation;}}
}
XmlSerializer serializer = new XmlSerializer(typeof(Results));
StringBuilder sb = new StringBuilder(); //this will contain the xml
serializer.Serialize(new TextWriter(sb), resultsObj);