我正在执行一些 XmlOverrides 并将属性设置为可为空(在本例中为 F1)。我想删除 nil="true" 和此属性周围的命名空间,但我无法使用我尝试过的任何方法删除它。
Nested n = new Nested();
n.Nest = "2";
n.F1 = null;
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes att = new XmlAttributes();
XmlElementAttribute el = new XmlElementAttribute("F1");
el.IsNullable = true;
att.XmlElements.Add(el);
overrides.Add(typeof(Nested), "F1", att);
XmlSerializer xs = new XmlSerializer(typeof(Nested), overrides);
var faultDocument = new XmlDocument();
var nav = faultDocument.CreateNavigator();
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
using (var writer = nav.AppendChild())
{
xs.Serialize(writer, n, ns);
}
我得到的XML是这样的:
<Nested>
<F1 p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance"/>
<Nest>2</Nest>
</Nested>
但是我希望 F1 元素为空,没有 nil 和 xmlns
<Nested>
<F1/>
<Nest>2</Nest>
</Nested>
尝试在属性 F1 中添加嵌套类[XmlElement(ElementName = "F1", IsNullable = true)]
。
我设法解决了它,不确定这是否是最好的方法:
private static void RemoveNils(XElement elem)
{
string nilNamespace = "{http://www.w3.org/2001/XMLSchema-instance}nil";
//first condition should be enough, the rest are just fail-safes
if (elem.Attributes().Any(name => name.Name == nilNamespace) && elem.Elements().Count() == 0 && elem.IsEmpty)
{
elem.Attributes().Remove();
return;
}
foreach (XElement el in elem.Elements())
RemoveNils(el);
}
试试这个
Nested n = new Nested();
n.Nest = "2";
n.F1 = null;
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes att = new XmlAttributes();
XmlElementAttribute el = new XmlElementAttribute("F1");
el.IsNullable = true;
att.XmlElements.Add(el);
overrides.Add(typeof(Nested), "F1", att);
XmlSerializer xs = new XmlSerializer(typeof(Nested));
var faultDocument = new XmlDocument();
var nav = faultDocument.CreateNavigator();
StringWriter strWriter = new StringWriter();
XmlTextWriter TextWriter = new XmlTextWriter(strWriter);
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
xs.Serialize(TextWriter, n, ns);
ReqXml = strWriter.ToString();
TextWriter.Close();
return ReqXml;