c# - XmlSerializer 生成重复序列的错误顺序
问题描述
当我在一个中继器上xsd:sequence
例如:<xsd:sequence minOccurs="1" maxOccurs="unbounded">
这将是匹配的 xml:
<Element>
<name>e1</name>
<number>n1</number>
<details>i1</details>
<name>e2</name>
<number>n2</number>
<details>i2</details>
<name>e3</name>
<number>n3</number>
<details>i3</details>
</Element>
另一方面,当我在元素上有一个中继器时:
<xsd:sequence>
<xsd:element name="name" type="xsd:token" minOccurs="1" maxOccurs="unbounded"/>
<xsd:element name="number" type="xsd:token" minOccurs="1" maxOccurs="unbounded"/>
<xsd:element name="details" type="xsd:token" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
匹配的 xml 将是:
<Element>
<name>e1</name>
<name>e2</name>
<name>e3</name>
<number>n1</number>
<number>n2</number>
<number>n3</number>
<details>i1</details>
<details>i2</details>
<details>i3</details>
</Element>
但是当我将以下 xsd 文件转换为 C# 类时(使用xsd.exe)
<xsd:element name="Element" type="ElementType"/>
<xsd:complexType name="ElementType">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="name" type="xsd:token"/>
<xsd:element name="number" type="xsd:token"/>
<xsd:element name="details" type="xsd:token"/>
</xsd:sequence>
</xsd:complexType>
生成的 C# 类:
public partial class ElementType{
private string[] nameField;
private string[] numberField;
private string[] detailsField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("name", DataType="token")]
public string[] name{
get {
return this.nameField;
}
set {
this.nameField= value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("number", DataType="token")]
public string[] number {
get {
return this.numberField;
}
set {
this.numberField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("details", DataType="token")]
public string[] details{
get {
return this.detailsField;
}
set {
this.detailsField= value;
}
}
}
我得到了这个 xml(基于类生成XmlSerializer
)
<Element>
<name>e1</name>
<name>e2</name>
<name>e3</name>
<number>n1</number>
<number>n2</number>
<number>n3</number>
<details>i1</details>
<details>i2</details>
<details>i3</details>
</Element>
有没有办法生成正确的xml?或者如果这只是微软的XmlSerializer
工作方式,我需要如何修改 C# 类以获得正确的结果?
解决方案
使用客户序列化器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Linq;
using System.Xml.Schema;
namespace ConsoleApplication111
{
class Program
{
const string INPUT_FILENAME = @"c:\temp\test.xml";
const string OUTPUT_FILENAME = @"c:\temp\test1.xml";
static void Main(string[] args)
{
XmlReader reader = XmlReader.Create(INPUT_FILENAME);
XmlSerializer serializer = new XmlSerializer(typeof(ElementType));
ElementType elementType = (ElementType)serializer.Deserialize(reader);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
XmlWriter writer = XmlWriter.Create (OUTPUT_FILENAME, settings);
serializer.Serialize(writer, elementType);
}
}
[XmlRoot("Element")]
public partial class ElementType : IXmlSerializable
{
private string[] nameField;
private string[] numberField;
private string[] detailsField;
/// <remarks/>
[XmlElement(ElementName = "name", DataType = "token")]
public string[] name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
/// <remarks/>
[XmlElement(ElementName = "number", DataType = "token")]
public string[] number
{
get
{
return this.numberField;
}
set
{
this.numberField = value;
}
}
/// <remarks/>
[XmlElement(ElementName = "details", DataType = "token")]
public string[] details
{
get
{
return this.detailsField;
}
set
{
this.detailsField = value;
}
}
public void ReadXml(XmlReader reader)
{
XElement elementType = XElement.Load(reader);
nameField = elementType.Elements("name").Select(x => (string)x).ToArray();
numberField = elementType.Elements("number").Select(x => (string)x).ToArray();
detailsField = elementType.Elements("details").Select(x => (string)x).ToArray();
}
public void WriteXml(XmlWriter writer)
{
int count = nameField.Count();
XElement element = new XElement("Element");
for(int i = 0; i < count; i++)
{
element.Add(new XElement("name", name[i]));
element.Add(new XElement("number", number[i]));
element.Add(new XElement("details", detailsField[i]));
}
writer.WriteRaw(element.ToString());
}
public XmlSchema GetSchema()
{
return (null);
}
}
}
推荐阅读
- css - 未在 Rails 应用程序中应用 CSS 更改
- javascript - JestJS - 多个 websocket 连接挂起 Jest
- python - 将包含小数的字符串转换为包含大熊猫列的 int 的字符串的干净方法?
- flutter - Controller.to 和 Controller.getInstance() 之间的 GetX 区别?
- javascript - 如何使用 JavaScript 或 C# 清除浏览器 (Chrome) 历史记录
- oauth-2.0 - Oauth2 授权码流程:我在哪里存储授权码?
- c++ - 缺少共享的正则表达式库,但已经安装了它的 yum 包
- web-applications - 服务器离线客户端在线时的 PWA 离线模式
- javascript - 正则表达式模式不包含零
- php - 如何使目录中的文件列表在 html/php 中看起来更干净?