c# - 将空字段解析为 XML
问题描述
我正在解析 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/>
有什么建议吗?
解决方案
InvoiceDetailHeaderIndicator 属性是
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; }
}
推荐阅读
- r - 如何在 R Flexdashboard 的多个页面中使用相同的列侧边栏?
- javascript - 无法使用 JQuery 设置 Select2 下拉值
- sql - 在 SQL 中的 sp_execute sql 语句中查找日期间隔内的条目
- html - 在不同的表中插入多个信息,Mysq,Node.js
- webpack - Webpack 构建非常缓慢
- ios - 缺少装配参考?
- python - TypeVar 和 NewType 有什么区别?
- python-3.x - 如何删除我的 Urwid 小部件之间的空格?
- postgresql - 如何在 Express 中使用 Sequelize for Postgresql 实现 IS-A 关系?
- tcl - 在调用者上下文中打印包含列表变量的表达式