【问题标题】:Parse empty field to XML将空字段解析为 XML
【发布时间】:2026-02-09 19:55:02
【问题描述】:

我正在解析 XML 文件中某些元素中的空字符串类,如下所示。

objectCxml.Request.InvoiceDetailRequest.InvoiceDetailRequestHeader.InvoiceDetailHeaderIndicator = "";
XmlSerializer s = new XmlSerializer(typeof(cXML));
XmlTextWriter tw = new XmlTextWriter(path, Encoding.UTF8);
s.Serialize(tw, objectCxml);  

它会生成如下所示的 xml

<InvoiceDetailHeaderIndicator xsi:type="xsd:string"/>

但我想要它如下

<InvoiceDetailHeaderIndicator/>

有什么建议吗?

【问题讨论】:

  • 好吧,InvoiceDetailRequestHeader 是什么?我们可以在这里看到类和InvoiceDetailHeaderIndicator 属性吗?也许是object
  • InvoiceDetailHeaderIndicator 属性为对象

标签: c# xml-serialization


【解决方案1】:

InvoiceDetailHeaderIndicator 属性为object

所以...不要那样做?设置为string,您应该已经准备好了。

归根结底,这里的重点是XmlSerializer 希望能够可靠地往返数据;这就是它的工作。有两种方法可以做到这一点:

  1. 静态知道类型(即string,而不是类型模型中的object
  2. 在负载中嵌入额外的元数据 (xsi:type="xsd:string")

如果您不想要 2,则需要 1,否则 它无法工作。坦率地说,1 是一个更好的主意无论如何

我使用本地最小设置进行了测试,效果很好:

public class InvoiceHeaderThing
{
    public string InvoiceDetailHeaderIndicator { get; set; }
}

完整代码如下:

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

static class P
{
    static void Main()
    {
        const string path = "my.xml";

        var objectCxml = new cXML();
        objectCxml.Request.InvoiceDetailRequest.InvoiceDetailRequestHeader.InvoiceDetailHeaderIndicator = "";
        XmlSerializer s = new XmlSerializer(typeof(cXML));
        using (XmlTextWriter tw = new XmlTextWriter(path, Encoding.UTF8))
        {
            s.Serialize(tw, objectCxml);
        }

        Console.WriteLine(File.ReadAllText(path));
    }
}

public class cXML
{
    public RequestThing Request { get; set; } = new RequestThing();
}
public class RequestThing
{
    public InvoiceDetailThing InvoiceDetailRequest { get; set; } = new InvoiceDetailThing();
}
public class InvoiceDetailThing
{
    public InvoiceHeaderThing InvoiceDetailRequestHeader { get; set; } = new InvoiceHeaderThing();
}
public class InvoiceHeaderThing
{
    public string InvoiceDetailHeaderIndicator { get; set; }
}

【讨论】: