创建xml属性

  • 本文关键字:属性 xml 创建 c# xml
  • 更新时间 :
  • 英文 :


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[],以对齐所需的输出。
  • XmlText中,我指定了底层实体的值
  • 使用XmlAttribute,我已经为底层实体指定了一个属性。

让我们使用您的示例数据:

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命名空间。

你可以看到你的数据模型是独立于序列化的。

最新更新