XML文件的结构类
类CustomsMessage
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class CUSTOMMESSAGES
{
private CUSTOMMESSAGES_HEADER HEADER_FIELD;
public CUSTOMMESSAGES_HEADER Header
{
get { return this.HEADER_FIELD; }
set { this.HEADER_FIELD = value; }
}
}
//类头
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class CUSTOMMESSAGES_HEADER
{
private string SubmitToCustoms_Field;
private string SubmissionType_Field;
public string SubmitToCustoms
{
get { return this.SubmitToCustoms_Field; }
set { this.SubmitToCustoms_Field = value; }
}
[XmlAttribute("SubmissionType")]
public string SubmissionType
{
get { return this.SubmissionType_Field; }
set { this.SubmissionType_Field = value; }
}
}
另一个构建XML文件的类
public string GeneralXML1()
{
CUSTOMMESSAGES CustomMessage = new CUSTOMMESSAGES();
CUSTOMMESSAGES_HEADER HEADER = new CUSTOMMESSAGES_HEADER();
HEADER.SubmitToCustoms = "Y";
HEADER.SubmissionType = "Original";
tmp = XmlExtension.Serialize<CUSTOMMESSAGES>(CustomMessage);
}
我要的XML文件
<CustomsMessage>
<Header>
<SubmitToCustoms SubmissionType="Original">Y</SubmitToCustoms>
</Header>
</CustomsMessage>
如何添加属性到SubmitToCustoms标签?我曾尝试过XmlRoot,但它不起作用。需要帮助,谢谢你
获得所需输出的一种方法需要对您的类进行一些轻微的修改。
(为了简洁,我使用了自动属性)
[XmlRoot("CustomsMessage")]
public class CUSTOMMESSAGES
{
[XmlArray("Header")]
[XmlArrayItem("SubmitToCustoms")]
public CUSTOMMESSAGES_HEADER[] Header { get; set; }
}
public class CUSTOMMESSAGES_HEADER
{
[XmlText]
public string SubmitToCustoms { get; set; }
[XmlAttribute("SubmissionType")]
public string SubmissionType { get; set; }
}
- 对于
XmlRoot
,我指定了顶级实体 - 对于
XmlArray
,我指定了中间层实体 - 使用
XmlArrayItem
,我指定了底层实体- 我已经将
Header
的类型从CUSTOMMESSAGES_HEADER
更改为CUSTOMMESSAGES_HEADER[]
,以对齐所需的输出。
在 - 我已经将
- 使用
XmlAttribute
,我已经为底层实体指定了一个属性。
XmlText
中,我指定了底层实体的值让我们使用您的示例数据:
CUSTOMMESSAGES CustomMessage = new CUSTOMMESSAGES();
CUSTOMMESSAGES_HEADER HEADER = new CUSTOMMESSAGES_HEADER();
CustomMessage.Header = new [] { HEADER };
HEADER.SubmitToCustoms = "Y";
HEADER.SubmissionType = "Original";
注意:您必须显式地连接消息和头。这在您的示例代码中是缺失的。
现在让我们调用序列化器:var serializer = new XmlSerializer(typeof(CUSTOMMESSAGES));
using StringWriter textWriter = new StringWriter();
serializer.Serialize(textWriter, CustomMessage);
var tmp = textWriter.ToString();
输出将是:
<?xml version="1.0" encoding="UTF-16"?>
<CustomsMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Header>
<SubmitToCustoms SubmissionType="Original">Y</SubmitToCustoms>
</Header>
</CustomsMessage>
为了摆脱名称空间和xml声明,我们需要使用以下代码:
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
var settings = new XmlWriterSettings { OmitXmlDeclaration = true};
var serializer = new XmlSerializer(typeof(CUSTOMMESSAGES));
await using StringWriter textWriter = new StringWriter();
using var writer = XmlWriter.Create(textWriter, settings);
serializer.Serialize(writer, CustomMessage, ns);
var tmp = textWriter.ToString();
现在,输出将如预期的那样。
<CustomsMessage>
<Header>
<SubmitToCustoms SubmissionType="Original">Y</SubmitToCustoms>
</Header>
</CustomsMessage>
更新:如何减少属性的数量
替代# 1为了减少属性的数量,层次结构和类的名称应该尽可能地与XML相似:
public class CustomsMessage
{
public Header Header { get; set; }
}
public class Header
{
public SubmitToCustoms SubmitToCustoms { get; set; }
}
public class SubmitToCustoms
{
[XmlText]
public string Value { get; set; }
[XmlAttribute("SubmissionType")]
public string SubmissionType { get; set; }
}
您可以看到,通过这种方法,我们已经将属性的数量从5个减少到2个。
现在,示例对象创建看起来像这样:var CustomMessage = new CustomsMessage
{
Header = new Header
{
SubmitToCustoms = new SubmitToCustoms
{
SubmissionType = "Original",
Value = "Y"
}
}
};
替代# 2如果我们从声明性切换到,我们可以去掉所有的属性。基于序列化到命令式.var type = CustomMessage.Header.SubmitToCustoms.SubmissionType;
var value = CustomMessage.Header.SubmitToCustoms.Value;
var xml =
new XElement("CustomsMessage",
new XElement("Header",
new XElement("SubmitToCustoms",
new XAttribute("SubmitType", type),
new XText(value))));
tmp = xml.ToString();
这里我们正在使用System.Xml.Linq
命名空间。
你可以看到你的数据模型是独立于序列化的。