XMLSerialization问题

时间:2015-09-05 22:44:05

标签: xml-serialization

我需要生成将由外部应用程序使用的XML文件。我观察到它依赖于XML中定义的命名空间的排序。由于xml被外部应用程序使用,因此我没有确切的错误详细信息。

以下是示例代码

        [System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "3.4.0.32990")]
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mycompany.com/2010/package")]
    [System.Xml.Serialization.XmlRootAttribute("Catalog", Namespace="http://mycompany.com/2010/package", IsNullable=false)]
    public partial class PackageT : System.ComponentModel.INotifyPropertyChanged {
    }

为了包含自定义schemalocation而编写的扩展类

public partial class PackageT
{
    [XmlAttributeAttribute("schemaLocation", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string xsiSchemaLocation = "http://mycompany.com/2010/catalog.xsd";
}

将对象序列化为XML的代码

 XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
        namespaces.Add("xml", "http://www.w3.org/XML/1998/namespace"); 
        namespaces.Add("test", "http://mycompany.com/2010/package");                
        XmlSerializer serializer = new XmlSerializer(typeof(PackageT));          
        TextWriter writer = new StreamWriter("package.xml");
        serializer.Serialize(writer, catalog, namespaces);
        writer.Flush();
        writer.Close(); 

生成的XML(不工作)

<?xml version="1.0" encoding="utf-8"?>
<test:Catalog 
  xmlns:xml="http://www.w3.org/XML/1998/namespace"
  d1p1:schemaLocation="http://mycompany.com/2010/catalog.xsd"
 xmlns:d1p1="http://www.w3.org/2001/XMLSchema-instance" xmlns:test="http://mycompany.com/2010/package">
 ....
 </test:Catalog>

正在运行的预期XML

<?xml version="1.0" encoding="utf-8"?>
<test:Catalog d1p1:schemaLocation="http://mycompany.com/2010/catalog.xsd"
 xmlns:xml="http://www.w3.org/XML/1998/namespace"
 xmlns:d1p1="http://www.w3.org/2001/XMLSchema-instance" xmlns:test="http://mycompany.com/2010/package">
 ....
 </test:Catalog>

请帮助我!!

1 个答案:

答案 0 :(得分:0)

如果为根指定元素名称和命名空间,则可以生成您正在寻找的XML。修改PackageT如下:

[XmlRoot(ElementName = "Catalog", Namespace = "http://mycompany.com/2010/package") ]
public partial class PackageT
{
    [XmlAttribute("schemaLocation", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string xsiSchemaLocation = "http://mycompany.com/2010/catalog.xsd";
}

,输出变为:

<?xml version="1.0" encoding="utf-8"?>
<test:Catalog xmlns:xml="http://www.w3.org/XML/1998/namespace"
              d1p1:schemaLocation="http://mycompany.com/2010/catalog.xsd"
              xmlns:d1p1="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:test="http://mycompany.com/2010/package" />