0

XMLをC#オブジェクトに逆シリアル化しようとしています

エラーが発生します:XMLドキュメント(3、2)にエラーがあります。

直せないようです!コードは次のとおりです。

XSDは次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML Studio 2012 Developer Edition (Trial) 10.0.2.3955     (http://www.liquid-technologies.com)-->
<xs:schema xmlns:tns="http://www.adamroe.com/xsd/cameras.xsd" elementFormDefault="qualified" targetNamespace="http://www.adamroe.com/xsd/cameras.xsd"     xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="CameraBase">
    <xs:complexType>
        <xs:sequence minOccurs="1" maxOccurs="1">
            <xs:element name="Cameras">
                <xs:complexType>
                    <xs:sequence minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="Camera" type="tns:CameraType" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:complexType name="CameraType">
    <xs:sequence>
        <xs:element name="Make" type="xs:string" />
        <xs:element name="Model" type="xs:string" />
        <xs:element name="Variable1" type="xs:double" />
        <xs:element name="Variable2" type="xs:double" />
    </xs:sequence>
</xs:complexType>
</xs:schema>

XMLは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML Studio 2012 Developer Edition (Trial) 10.0.2.3955     (http://www.liquid-technologies.com) -->
<aroe:CameraBase xmlns:aroe="http://www.adamroe.com/xsd/cameras.xsd"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://www.adamroe.com/xsd/cameras.xsd     C:\Users\Adam\Desktop\Cameras.xsd">
<aroe:Cameras>
    <aroe:Camera>
    <aroe:Make>SONY</aroe:Make>
    <aroe:Model>DSC-W130</aroe:Model>
    <aroe:Variable1>0.6352</aroe:Variable1>
    <aroe:Variable2>22.375</aroe:Variable2>
</aroe:Camera>
<aroe:Camera>
    <aroe:Make>Panasonic</aroe:Make>
    <aroe:Model>DMC-FX30</aroe:Model>
    <aroe:Variable1>0.8869</aroe:Variable1>
    <aroe:Variable2>24.73</aroe:Variable2>
</aroe:Camera>
<aroe:Camera>
    <aroe:Make>Olympus</aroe:Make>
    <aroe:Model>X450</aroe:Model>
    <aroe:Variable1>0.6003</aroe:Variable1>
    <aroe:Variable2>20.654</aroe:Variable2>
</aroe:Camera>
<aroe:Camera>
    <aroe:Make>Fujifilm</aroe:Make>
    <aroe:Model>FinePix S9600</aroe:Model>
    <aroe:Variable1>1.0024</aroe:Variable1>
    <aroe:Variable2>35.704</aroe:Variable2>
</aroe:Camera>
<aroe:Camera>
    <aroe:Make>Canon</aroe:Make>
    <aroe:Model>EOS 400D</aroe:Model>
    <aroe:Variable1>1.5143</aroe:Variable1>
    <aroe:Variable2>69.409</aroe:Variable2>
</aroe:Camera>
</aroe:Cameras>
</aroe:CameraBase>

クラスは次のとおりです。

public class Camera
{
    public string Make;
    public string Model;
    public double Variable1;
    public double Variable2;
}

コードの逆シリアル化:

public class PopulateXML
{
    public void DeserializeObject(string filenameXML)
    {
        Console.WriteLine("Reading with XmlReader");

        // Create an instance of the XmlSerializer specifying type and namespace.
        XmlSerializer serializer = new
        XmlSerializer(typeof(List<Camera>));

        // A FileStream is needed to read the XML document.
        FileStream fs = new FileStream(filenameXML, FileMode.Open);
        XmlReader reader = new XmlTextReader(fs);

        // Declare an object variable of the type to be deserialized.
        List<Camera> i;

        // Use the Deserialize method to restore the object's state.
        i = (List<Camera>)serializer.Deserialize(reader);
    }
}

主要:

PopulateXML x = new PopulateXML();
        // Read a purchase order.
        x.DeserializeObject("Cameras.xml");

例外がスローされます:i =(List)serializer.Deserialize(reader);

4

2 に答える 2

2
XmlSerializer serializer = new XmlSerializer(typeof(Camera));

Stream fs = File.OpenRead(filenameXMLpath);

// Use the Deserialize method to restore the object's state.
Camera cam = serializer.Deserialize(fs) as Camera;

これは間違いなくあなたのために働くでしょう。あなたの場合、間違ったデータ型、つまりListに型キャストしていたため、機能していませんでした。このエラーは通常、開発者がデシリアライズされたオブジェクトを正しくないデータ型にキャストするたびにポップアップします。

于 2013-03-25T17:20:48.887 に答える
0

LinqToXml とこれらの拡張機能を使用できます: http://searisen.com/xmllib/extensions.wikiを使用して、Xml を簡単に解析できます。

XElement root = XElement.Load(file); // or .Parse(string)
List<Camera> cameras = root.GetEnumerable("Cameras/Camera", x => new Camera()
{
    Make = x.Get("Make", string.Empty),
    Model = x.Get("Model", string.Empty),
    Variable1 = x.Get<double>("Variable1", 0),
    Variable2 = x.Get<double>("Variable2", 0)
}).ToList();

PS私はそれをテストしましたが、あなたのxmlで動作します。

PSS この属性[DebuggerDisplay("{Make} - {Model}")]をカメラ クラスに追加して、デバッガーでのリスト/配列の表示を改善することを検討してください。

于 2012-04-11T16:57:38.577 に答える