2

名前空間 School の下に単純なクラス Student があります。

namespace XmlTestApp
{
    public class Student
    {
        private string studentId;

        public string FirstName;
        public string MI;
        public string LastName;

        public Student()
        {
            //Just provided for making Serialization work as obj.GetType() needs parameterless constructor.
        }

        public Student(String studentId)
        {
            this.studentId = studentId;
        }

    }
}

これをシリアル化すると、シリアル化された xml として取得されます。

<?xml version="1.0" encoding="utf-8"?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FirstName>Cad</FirstName>
  <MI>Dsart</MI>
  <LastName>dss</LastName>
</Student>

しかし、私が欲しいのはこれです。基本的に、xml のクラス名の前に付けられた名前空間が必要です。これは可能ですか?

<?xml version="1.0" encoding="utf-8"?>
<XmlTestApp:Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FirstName>Cad</FirstName>
  <MI>Dsart</MI>
  <LastName>dss</LastName>
</Student>

ここに私のシリアライゼーションコードがあります:

Student s = new Student("2");
            s.FirstName = "Cad";
            s.LastName = "dss";
            s.MI = "Dsart";

            System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(s.GetType());

            TextWriter txtW=new StreamWriter(Server.MapPath("~/XMLFile1.xml"));
            x.Serialize(txtW,s);
4

3 に答える 3

2

編集:短い答えはまだイエスです。適切な属性は、実際には XmlType 属性です。さらに、名前空間を指定する必要があります。次に、シリアル化コードで、要素を修飾するために使用される名前空間のエイリアスを指定する必要があります。

namespace XmlTestApp
{
    [XmlRoot(Namespace="xmltestapp", TypeName="Student")]
    public class Student
    {
        private string studentId;

        public string FirstName;
        public string MI;
        public string LastName;

        public Student()
        {
            //Just provided for making Serialization work as obj.GetType() needs parameterless constructor.
        }

        public Student(String studentId)
        {
            this.studentId = studentId;
        }

    }
}

...

        Student s = new Student("2");
        s.FirstName = "Cad";
        s.LastName = "dss";
        s.MI = "Dsart";

        System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(s.GetType());

        System.Xml.Serialization.XmlSerializationNamespaces ns = new System.Xml.Serialization.XmlSerializationNamespaces();

        ns.Add("XmlTestApp", "xmltestapp");

        TextWriter txtW=new StreamWriter(Server.MapPath("~/XMLFile1.xml"));
        x.Serialize(txtW,s, ns); //add the namespace provider to the Serialize method

W3.org の XSD/XSI を引き続き使用するように名前空間の設定をいじる必要があるかもしれませんが、これで正しい軌道に乗るはずです。

于 2012-06-18T19:03:59.937 に答える
0

それを達成する別の方法は、xmlを作成することです-ビジュアルスタジオでツールを使用するよりも-xmlをxsdに書き込みます。xsd をお持ちの場合は、xsdToCode でシリアル化可能なクラスを生成できます

于 2012-06-18T19:04:23.387 に答える
0

洗練された解決策は、XmlSerializerNamespaces を使用して名前空間を宣言し、それを XmlSerializer に渡すことです。

XML シリアライゼーションと名前空間プレフィックスを参照してください

于 2012-06-18T19:08:44.007 に答える