XSD生成的包含System.Xml.XmlElement属性的类

时间:2018-10-30 11:02:31

标签: c# xml xsd

我目前正在生成用于配置服务器的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="">,但这仍然不是一个完整的解决方案。

我觉得可能还有其他方法可以做到这一点,但我不确定如何做到。

有什么建议吗?

1 个答案:

答案 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();

Code on GitHub

我注意到的是,名称空间被两次包含,一个被包含在根节点中,然后又包含了直接后代(第一个孩子)。

# 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>
--------------------