将空字段解析为 XML
Parse empty field to XML
我正在用 XML 文件中某些元素中的空字符串解析 class,如下所示。
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/>
有什么建议吗?
InvoiceDetailHeaderIndicator property is object
所以...不要那样做?让它成为 string
你应该被设置。
最终,这里的重点是XmlSerializer
希望能够可靠地往返数据;这是它的工作。有两种方法可以做到这一点:
- 静态知道类型(即
string
而不是类型模型中的 object
)
- 在有效载荷中嵌入额外的元数据(
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; }
}
我正在用 XML 文件中某些元素中的空字符串解析 class,如下所示。
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/>
有什么建议吗?
InvoiceDetailHeaderIndicator property is
object
所以...不要那样做?让它成为 string
你应该被设置。
最终,这里的重点是XmlSerializer
希望能够可靠地往返数据;这是它的工作。有两种方法可以做到这一点:
- 静态知道类型(即
string
而不是类型模型中的object
) - 在有效载荷中嵌入额外的元数据(
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; }
}