我目前正在生成用于配置服务器的XML文件。
我有一个用xsd生成的类,它包含类型System.Xml.XmlElement
的属性。
public class GeneratedClass
{
...
private System.Xml.XmlElement informationField;
[System.Xml.Serialization.XmlArrayItemAttribute("Information", IsNullable=false)]
public System.Xml.XmlElement Information {
get {
return this.informationField;
}
set {
this.informationField = value;
}
}
...
}
我在将自定义对象“注入”此Information属性时遇到麻烦。
public class MyExampleObject
{
public string Name { get; set; }
public string Id { get; set;
}
该程序反序列化类型为GeneratedClass
的xml文件,然后我想将MyExampleObject
添加到Informations
属性中。
我当前的操作方式是使用此方法:
XmlDocument doc = new XmlDocument();
using (XmlWriter writer = doc.CreateNavigator().AppendChild())
{
XmlSerializer serializer = new XmlSerializer(typeof(MyExampleObject));
serializer.Serialize(writer, MyObject);
}
this.Information = doc.DocumentElement;
此后,我将整个对象序列化为文件,但是当我这样做时,我得到了不需要的xml名称空间属性。
<Information xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
我发现了其他存在类似问题的帖子,但是建议的解决方案使我离开<Information xmlns="">
,但这仍然不是一个完整的解决方案。
我觉得可能还有其他方法可以做到这一点,但我不确定如何做到。
有什么建议吗?
答案 0 :(得分:0)
我知道这篇文章很老:)但是对于寻求答案的其他人可能会派上用场
更新抱歉,我读了您的问题有点快,并专注于我自己的问题,该问题在某种意义上也涉及名称空间,但更多地涉及如何删除名称空间。我看到您使用XmlSerializer
,但不幸的是,我不知道如何操作作为类属性添加的名称空间进行序列化。也许看一下XmlRootAttribute
,您可以将其传递给XmlSerializer.ctor
,然后获得XmlSerializerNamespaces
,它在序列化过程中被传递并提供操纵名称空间的手段。
我最近也偶然发现了这个问题,并找到了解决方案。
var xmlDocument = new XmlDocument();
var xmlElement = xmlDocument.CreateElement(Prefix, "Document", Ns);
xmlElement.InnerXml = string.Empty;
var navigator = xmlElement.CreateNavigator();
navigator.AppendChildElement(Prefix, "InfRspnSD1", Ns, null);
navigator.MoveToFirstChild();
navigator.AppendChildElement(Prefix, "InvstgtnId", Ns, "123456789");
// At this point xmlElement contains XML and can be assigned
// to the generated class
// For pretty print only
using var sw = new StringWriter();
using var writer = System.Xml.XmlWriter.Create(sw, Settings);
xmlElement.WriteTo(writer);
writer.Flush();
return sw.ToString();
我注意到的是,名称空间被两次包含,一个被包含在根节点中,然后又包含了直接后代(第一个孩子)。
# Generate XML using XNavigator
<?xml version="1.0" encoding="utf-16"?>
<supl:Document xmlns:supl="urn:iso:std:iso:20022:tech:xsd:supl.027.001.01">
<supl:InfRspnSD1 xmlns:supl="urn:iso:std:iso:20022:tech:xsd:supl.027.001.01">
<supl:InvstgtnId>123456789</supl:InvstgtnId>
</supl:InfRspnSD1>
</supl:Document>
--------------------