2

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

<Test><string name="Name">Test name</string><string name="Description">Some fake description.</string></Test>

次のクラスに入ります。

[XmlRoot("Test")]
public class Test
{
 [XmlElement("string")]
 public string Name;

 [XmlElement("string")]
 public string Description;
}

私がやっているコードを使用しています。

var xml = @"<Test><string name=""Name"">Test name</string><string name=""Description"">Some fake description.</string></Test>";
XmlReader reader = new XmlTextReader(new StringReader(xml));
XmlSerializer serializer = new XmlSerializer(typeof(Test));
serializer.Deserialize(reader);

これを実行すると、メッセージとともに InvalidOperationException が発生します

タイプ「テスト」を反映するエラーがありました。

Description プロパティをコメントアウトすると、機能します。属性値またはテキストを取得できますが、要素が文字列で、「名前」属性に特定の値がある XmlText だけを取得することはできません。

これは、LINQ を使用しなくても可能ですか?

4

3 に答える 3

1

私のコメントによると:

確かに何かを変えずにそれを行うことはできません。「string」要素の属性である場合、Descriptionは要素であることを.NETに伝えています。LINQを使用する

これがLINQの例です。XMLを拡張してクラスから切り離すのは非常に簡単です(これは多くの場合良いことです!)。

var xml = @"<Test><string name=""Name"">Test name</string><string name=""Description"">Some fake description.</string></Test>";
var xdoc = XDocument.Parse(xml);

var output = from test in xdoc.Elements("Test")
             let strings = test.Elements("string").ToDictionary(e => e.Attribute("name").Value, e => e.Value)
             select new Test () { Name = strings["Name"],
                                  Description = strings["Description"] };
于 2012-05-04T21:05:46.067 に答える
0

その理由は、意図したとおりにXmlElementを使用していないためです。要素名「文字列」は、クラスで一意である必要があります。「名前」属性は考慮されません。

したがって、要約すると、そのxmlドキュメントを自動的に逆シリアル化することはできません。逆シリアル化メソッドを自分で実装する必要があります。

于 2012-05-04T20:49:02.153 に答える
0

そのためには、次のものが必要です。

public class Foo {
    [XmlAttribute("name")]
    public string Name {get;set;}
    [XmlText]
    public string Value {get;set;}
}

次に、親タイプで次のように入力します。

[XmlRoot("Test")]
public class Test
{
    [XmlElement("string")]
    public List<Foo> Items {get;set;}
}

IXmlSerializableこれは、 (非常に難しい)使用しない限り、その形状の XML を処理できる唯一の方法です。

于 2012-05-04T20:51:16.773 に答える