1

次の XML 出力を逆シリアル化しようとしています。

<?xml version="1.0" encoding="ISO-8859-1"?>
<Foo>
   <Val>Data1</Val>
</Foo>
<Foo>
   <Val>Data2</Val>
</Foo>

(これはハードウェアデバイスからの出力であり、変更できません)

次のように定義された XML タイプがあります。

    [XmlType(AnonymousType=true, Namespace="")]
    public class Foo
    {
        public string Val { get; set; }
    }

次のようなシリアライザーを作成して、この配列をデシリアライズしようとしました。

  var s = new XmlSerializer(typeof(Foo[]));
  //or
  var s = new XmlSerializer(typeof(List<Foo>);

ただし、s.Deserialize() を呼び出すたびに、InvalidOperaitonException が発生します。

 System.InvalidOperationException: <Foo xmlns=''> was not expected.

ノート

 var s = new XmlSerializer(typeof(Foo));
 // Only deseralizes the first Foo (Data1).

ご協力いただきありがとうございます。

4

6 に答える 6

8

問題は、提供されたxmlにあると思います。

テストアプリは言う

List<Foo> list = new List<Foo> {new Foo {Val = "Data1"}, new Foo {Val = "Data2"}};
var s = new XmlSerializer(typeof(List<Foo>));
StringBuilder sb = new StringBuilder();
XmlWriter wr = XmlWriter.Create(sb);
s.Serialize(wr, list);

string ss = sb.ToString();

var s2 = new XmlSerializer(typeof(List<Foo>));
StringReader sr = new StringReader(ss);
List<Foo> returnList = (List<Foo>)s2.Deserialize(sr);

そしてXMLは

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfFoo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Foo>
        <Val>Data1</Val>
    </Foo>
    <Foo>
        <Val>Data2</Val>
    </Foo>
</ArrayOfFoo>

最初の行を削除できる場合

<?xml version="1.0" encoding="ISO-8859-1"?>

そして、文字列を最小化します

string s = "<ArrayOfFoo><Foo>   <Val>Data1</Val></Foo><Foo>   <Val>Data2</Val></Foo></ArrayOfFoo>";
var s2 = new XmlSerializer(typeof(List<Foo>));
StringReader sr = new StringReader(s);
List<Foo> list = (List<Foo>)s2.Deserialize(sr);

それはうまくいくかもしれません。

于 2009-12-22T12:03:08.383 に答える
7

それは有効な Xml ではありません。適切に機能させるには、コア ルート要素が必要です。

于 2009-12-22T12:01:28.510 に答える
3

これは有効な xml ではないため、有効な xml のように逆シリアル化することはできません。これを機能させるには、ある種のハックが必要です。xml の先頭に挿入し、xml の最後に挿入することをお勧めします。xml側でこの変更を行うことはできないため、コードでそれを行います。

String ss; 
// lets assume this holds your xml data in string.
ss.append("</ArrayOfFoo>");
ss.replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "<?xml version=\"1.0\" encoding=\"utf-16\"?> <ArrayOfFoo>")

var s2 = new XmlSerializer(typeof(List<Foo>));
StringReader sr = new StringReader(ss);
List<Foo> returnList = (List<Foo>)s2.Deserialize(sr); 

これで正しいリストが返されます。

于 2009-12-22T12:50:13.593 に答える
1

技術的には整形式のXMLドキュメント(ルート要素が1つだけある)ではなく、整形式の外部解析エンティティ(他の要素に含まれていない要素やテキストをいくつでも持つことができる)があります。どの要素にも含まれていません)。したがって、XMLパーサーにドキュメントではなくEPEを解析するためのエントリポイントがあるかどうかを解析する必要があります。EPEを参照して含むスタブドキュメントを作成し、そのドキュメントを解析することもできます。

于 2009-12-22T12:52:55.867 に答える
1

他のポスターが言うように、ハードウェア デバイスが生成するこの XML は、.NET がオブジェクトをシリアル化/逆シリアル化する方法と互換性がありません。有効な XML、および .NET には有効な XML が必要であり、ルート要素があります。

私は提案します:

  • 取得した XML を変更して、astander が xml コード スニペットで提示する方法に一致させます。
  • または、必要に応じてファイルを逆シリアル化するファイル用の単純な xml パーサーを作成します。

br、マルセル

于 2009-12-22T12:18:53.130 に答える
0

Xstream for .Netは便利な API になる可能性があります

于 2009-12-22T11:56:22.890 に答える