3

私は、要素で満たされたXMLファイルをプロパティのクラスに逆シリアル化する簡単な方法があるかどうかを調べています。具体的には、アタッチするプロパティとして要素属性「name」を使用します。たとえば、次のようなXMLファイル形式があります。

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <setting name="number_val_one">1</setting>
  <setting name="string_val_one">test</setting>
  <setting name="number_val_two">42</setting>
  <setting name="string_val_two">hello world</setting>
</settings>

これを逆シリアル化して、この形式に似たクラスに戻す簡単な方法があるかどうか疑問に思っています。

public class SomeObject
{
    [XmlElement("number_value_one")]
    public Int32 NumberValueOne { get; set; }

    [XmlElement("number_value_two")]
    public Int32 NumberValueTwo { get; set; }

    [XmlElement("string_value_one")]
    public String StringValueOne { get; set; }

    [XmlElement("string_value_two")]
    public String StringValueTwo { get; set; }
}

この形式はシリアル化などに最適ではないことは理解していますが、このプロジェクトのファイルの形式を変更することはできません。現在、私は各要素を手作業で読んでおり、その値は多くのコードであり、かなり厄介です。シリアル化してxmlに戻すために、リフレクションを使用して、各要素を手動で記述する必要性を回避しています。しかし、このフォーマットを処理する簡単な方法があるかどうか疑問に思っています。

ただし、すべての要素がstring / intであるとは限りません。一部の要素は、読み取られた後に解析されるカスタムタイプです。

4

1 に答える 1

3

1つは、xsltを使用して、入力文字列をで認識できるデータに変換できますXmlSerializer

var transform = new XslCompiledTransform();
transform.Load(XmlReader.Create(new StringReader(transformText)));
var memoryStream = new MemoryStream();
transform.Transform(new XPathDocument(new StringReader(text)),null,memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
var deserializer = new XmlSerializer(typeof(SomeObject)).Deserialize(memoryStream);

どこ

            var transformText = @"
<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
    <xsl:output method=""xml"" encoding=""utf-8"" indent=""no""/>
    <xsl:template match=""/"">
        <SomeObject>
            <xsl:for-each select=""settings/setting"">
                <xsl:element name=""{@name}"">
                    <xsl:value-of select="".""/>
                </xsl:element>
            </xsl:for-each>
        </SomeObject>   
    </xsl:template>
</xsl:stylesheet>";

        var text = @"
<settings>
    <setting name=""number_val_one"">1</setting>
    <setting name=""string_val_one"">test</setting>
    <setting name=""number_val_two"">42</setting>
    <setting name=""string_val_two"">hello world</setting>
</settings>";

setting name属性値はXmlElementAttribute、プロパティに適用された状態で一致する必要があることに注意してください。

xsltを理解していない場合は、xsltを検索してください。そこには、多くの例と参照があります。

于 2012-12-30T19:51:26.730 に答える