使用相同的默认名称和命名的名称空间序列化xml

时间:2012-10-15 12:43:36

标签: .net xml xml-serialization xml-namespaces

我知道它看起来不是最佳实践,但我需要生成具有相同命名空间的xml

例如:

<ns1:root xsi:schemaLocation=""http://schemalocation""
xmlns:ns1=""http://schema""
xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
xmlns=""http://schema"">
...
</ns1:root>

我还在序列化程序中添加了名称空间:

var xmlSerializerNamespaces = new XmlSerializerNamespaces();
xmlSerializerNamespaces.Add("ns1", "http://schema");
xmlSerializerNamespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmlSerializerNamespaces.Add(string.Empty, "http://schema");

这是班级本身:

[XmlRoot(ElementName = "request", Namespace = "http://schema")]
    [Serializable]
    public class Request 
    {
        [XmlAttributeAttribute("schemaLocation", Namespace = XmlSchema.InstanceNamespace)]
        public string SchemaLocation
        {
            get { return _schemaLocation; }
            set { _schemaLocation = value; }
        }

        ...

        private string _schemaLocation = "http://schemalocation";   }

所以一切都很好,但默认的xmlns不在生成的xml中。 我也玩过没有结果的XmlWriterSettings。 如果没有字符串替换,有什么想法吗?)

1 个答案:

答案 0 :(得分:0)

默认命名空间是根据您用于添加XML片段的命名空间设置的,例如

XNamespace defaultNs = @"http://schema";
var result = new XDocument(new XElement(defaultNs + "root"));

会产生以下输出:

<rootNode xmlns="http://schema">
</rootNode>

所以你要做的就是在文件中添加你的其他名字,即

XNamespace defaultNs = @"http://schema";
var root = new XElement(defaultNs + "root",
    new XAttribute("xsi", "schemaLocation", "http://schemaLocation"),
    new XAttribute(XNamespace.Xmlns + "ns1", defaultNs"),
    new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance")
);