1

次のような要素を持つ XML があります。

<hour base_forecast="12" datim="29/0" />

そしてエラーを受け取っています:

Unexpected node type Element. ReadElementString method can only be 
called on elements with simple or empty content.

これは、要素に値がないためだと思います。この XML は制御できないため、変更できません。これをどのように逆シリアル化しますか?

** 編集 **

属性の値の 1 つが ">6" です ....これが原因でしょうか? もしそうなら、どうすればそれを処理できますか?

** アップデート **

属性の値で > を返さないデータが見つかりました。同じエラーが発生しています。

** Edit #3 * 受信している XML の XSD を作成し、xsd ツールを使用してそれらのクラスを生成しました。この投稿の一番下に追加します。

デシリアライゼーション コードは次のとおりです。

        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("xxx");
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        WeatherData Result = new WeatherData();

        using (Stream st = resp.GetResponseStream())
        {
            XmlRootAttribute xRoot = new XmlRootAttribute();
            xRoot.ElementName = "model_data";
            xRoot.IsNullable = true;

            Result = new XmlSerializer(typeof(WeatherData), xRoot).Deserialize(st) as WeatherData;  ** Error here

返された XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE observation SYSTEM "http://private.com/hithere.dtd">
<model_data>
     <site a="28/12" b="KXXX">
         <hour x="-9999" y="-9999" z="-9999"/>
     </site>
</model_data>

データ オブジェクト

[Serializable, XmlRoot("model_data")]
public class WeatherData
{
    [XmlElement("site")]
    public string City { get; set; }

    [XmlAttribute]
    public string a { get; set; }

    [XmlAttribute]
    public string b { get; set; }

    [XmlElement(ElementName="hour", IsNullable=true)]
    public string Hour { get; set; }

    [XmlAttribute]
    public string x { get; set; }

    [XmlAttribute]
    public string y { get; set; }

    [XmlAttribute]
    public string z { get; set; }

}

XSD ツールによって生成されたクラス

**Removed generated classes, but they are similar to what Hugo posted **
4

2 に答える 2

0

この部分を見てください:

[XmlElement("site")]
public string City { get; set; }

<Site>が含まれ<Hour>ているので、単純なコンテンツや空のコンテンツを持つ要素ではないと思いますか?

編集:実際にはすべてが疑わしいようです。データオブジェクトは、xml内のすべての階層情報を無視しているようです。

このようなものはどうですか?

[Serializable, XmlRoot("model_data")]
public class WeatherData
{
    [XmlElement("site")]
    public City[] City { get; set; }
}

public class City
{
    [XmlAttribute]
    public string a { get; set; }

    [XmlAttribute]
    public string b { get; set; }

    [XmlElement(ElementName="hour", IsNullable=true)]
    public Hour Hour { get; set; }
}

public class Hour 
{    
    [XmlAttribute]
    public string x { get; set; }

    [XmlAttribute]
    public string y { get; set; }

    [XmlAttribute]
    public string z { get; set; }   
}
于 2012-04-28T21:42:29.433 に答える
0

XSD ツールを使用してクラスを生成すると、同じエラーが発生しましたが、コメントアウトした行からエラーがスローされていることが示されていました。

そこで、VS を終了し、ディスク クリーンアップを実行しました。コードを再度実行しました。「セキュリティ上の理由から、この XML ドキュメントなどでは DTD は禁止されています」というメッセージを受け取りました。そこで、リーダーを DtdProcessing.Parse に設定し、もう一度コードを実行しました。

成功しました。

于 2012-04-28T23:07:14.847 に答える