web-dev-qa-db-ja.com

XML文字列をオブジェクトに変換

私はソケットを介してXML文字列を受信して​​いるので、これらをC#オブジェクトに変換したいと思います。

メッセージは以下の形式です。

<msg>
   <id>1</id>
   <action>stop</action>
</msg>

私は.Netに慣れていないので、これを実行するためのベストプラクティスはわかりません。私は以前はJAXB for Javaを使っていましたが、似たようなものがあるのか​​、それとも別の方法で処理されるのかはわかりませんでした。

152
Steve

Windows SDKと共に次のようなディレクトリにインストールされるxsd.exeツールを使用する必要があります。

C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin

そして64ビットコンピュータでは:

C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin

そしてWindows 10コンピュータでは:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin

最初の実行では、xsd.exeを使用して、サンプルXMLをXSDファイル(XMLスキーマファイル)に変換します。

xsd yourfile.xml

これによりyourfile.xsdが得られます。これは2番目のステップで、xsd.exeを使用してC#クラスに再度変換できます。

xsd yourfile.xsd /c

これはyourfile.csというファイルをあなたに与えるでしょう。それはあなたが手に入れているXMLファイルを逆シリアル化するためにあなたが使うことができるC#クラスを含むでしょう。

XmlSerializer serializer = new XmlSerializer(typeof(msg));
msg resultingMessage = (msg)serializer.Deserialize(new XmlTextReader("yourfile.xml"));

ほとんどの場合、かなりうまくいくはずです。

更新: XMLシリアライザは入力として任意のストリームを取ります - ファイルまたはメモリストリームのどちらでも問題ありません。

XmlSerializer serializer = new XmlSerializer(typeof(msg));
MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(inputString));
msg resultingMessage = (msg)serializer.Deserialize(memStream);

またはStringReaderを使用します。

XmlSerializer serializer = new XmlSerializer(typeof(msg));
StringReader rdr = new StringReader(inputString);
msg resultingMessage = (msg)serializer.Deserialize(rdr);
249
marc_s

このメソッドを試してXmlをオブジェクトに変換してください。それはまさにあなたがしていることのために作られています:

protected T FromXml<T>(String xml)
{
    T returnedXmlClass = default(T);

    try
    {
        using (TextReader reader = new StringReader(xml))
        {
            try
            {
                returnedXmlClass = 
                    (T)new XmlSerializer(typeof(T)).Deserialize(reader);
            }
            catch (InvalidOperationException)
            {
                // String passed is not XML, simply return defaultXmlClass
            }
        }
    }
    catch (Exception ex)
    {
    }

    return returnedXmlClass ;        
}

このコードを使用してそれを呼び出します:

YourStrongTypedEntity entity = FromXml<YourStrongTypedEntity>(YourMsgString);
44
RJ.

管理者としてVisual Studio 2013を実行する... Xmlファイルの内容をコピーします。Visual Studio 2013>編集>形式を選択して貼り付け> XmlをC#クラスとして貼り付けに進みますXmlファイルの内容に従ってc#クラスを作成します。

11
user2667652

万が一誰かがこれを役に立つと思うかもしれません:

public static class XmlConvert
{
    public static string SerializeObject<T>(T dataObject)
    {
        if (dataObject == null)
        {
            return string.Empty;
        }
        try
        {
            using (StringWriter stringWriter = new System.IO.StringWriter())
            {
                var serializer = new XmlSerializer(typeof(T));
                serializer.Serialize(stringWriter, dataObject);
                return stringWriter.ToString();
            }
        }
        catch (Exception ex)
        {
            return string.Empty;
        }
    }

    public static T DeserializeObject<T>(string xml)
         where T : new()
    {
        if (string.IsNullOrEmpty(xml))
        {
            return new T();
        }
        try
        {
            using (var stringReader = new StringReader(xml))
            {
                var serializer = new XmlSerializer(typeof(T));
                return (T)serializer.Deserialize(stringReader);
            }
        }
        catch (Exception ex)
        {
            return new T();
        }
    }
}

あなたはそれを使ってそれを呼ぶことができます:

MyCustomObject myObject = new MyCustomObject();
string xmlString = XmlConvert.SerializeObject(myObject)
myObject = XmlConvert.DeserializeObject<MyCustomObject>(xmlString);
5
Razzer

上記のようにクラスを生成するか、手動で書くことができます。

[XmlRoot("msg")]
public class Message
{
    [XmlElement("id")]
    public string Id { get; set; }
    [XmlElement("action")]
    public string Action { get; set; }
}

その後、 ExtendedXmlSerializer を使用してシリアライズおよびデシリアライズを実行できます。

インストールExtendedXmlSerializerを nuget からインストールするか、次のコマンドを実行します。

Install-Package ExtendedXmlSerializer

シリアル化:

var serializer = new ConfigurationContainer().Create();
var obj = new Message();
var xml = serializer.Serialize(obj);

逆シリアル化

var obj2 = serializer.Deserialize<Message>(xml);

このシリアライザのサポート:

  • 標準XMLSerializerからの逆シリアル化xml
  • 直列化クラス、構造体、ジェネリッククラス、プリミティブ型、ジェネリックリストと辞書、配列、列挙型
  • プロパティインタフェースを持つ直列化クラス
  • 直列化循環参照および参照ID
  • Xmlの古いバージョンの逆シリアル化
  • プロパティの暗号化
  • カスタムシリアライザ
  • XmlElementAttributeとXmlRootAttributeをサポート
  • POCO - すべての設定(マイグレーション、カスタムシリアライザなど)はクラス外です

ExtendedXmlSerializerのサポート.NET 4.5以上および.NET Core。あなたはそれをWebApiとAspCoreと統合することができます。

2
Wojtpl2

Xsd.exeを使用して、.NETでスキーマバインドクラスを作成し、次にXmlSerializerで文字列をデシリアライズすることができます。 http://msdn.Microsoft.com/ja-jp/library/system.xml。 serialization.xmlserializer.deserialize.aspx

2
DaveShaw

Xmlメッセージのxsdがある場合は、.Net xsd.exeツールを使用してC#クラスを生成できます。

この.NETクラスはxmlの生成に使用できます。

0
Amitabh

私はこの質問が古いことを知っていますが、私はそれに出くわし、他の皆とは違う答えを持っています:-)

通常の方法(上記のコメンターが述べているように)は、クラスを生成し、xmlを逆シリアル化することです。

しかし、(警告:ここで恥知らずな自己宣伝)私はちょうどあなたがしないナゲットパッケージ、 here を公開しましたする必要がある。あなただけ行く:

string xml = System.IO.File.ReadAllText(@"C:\test\books.xml");
var book = Dandraka.XmlUtilities.XmlSlurper.ParseText(xml);

それは文字通りそれであり、他に何も必要ありません。そして、最も重要なのは、xmlが変更された場合、オブジェクトも自動的に変更されることです。

Dllを直接ダウンロードする場合、githubページは here です。

0
Jim Andrakakis

ここでの他の答えに加えて、XML DOMのような読み取りには XmlDocument クラス、早送り専用の XmlReader クラスを使用することも当然可能です。」手で"。

0
Skurmedel

Damianのすばらしい答えを単純化する

public static T ParseXml<T>(this string value) where T : class
{
    var xmlSerializer = new XmlSerializer(typeof(T));
    using (var textReader = new StringReader(value))
    {
        return (T) xmlSerializer.Deserialize(textReader);
    }
}
0
Sam Jazz

高度なxsdからc#クラスへの生成ツール別の方法:xsd2code.com。このツールはとても便利で強力です。 Visual Studioのxsd.exeツールよりもはるかにカスタマイズが豊富です。 Xsd2Code ++は、リストまたは配列を使用するようにカスタマイズでき、多数のImportステートメントを含む大規模スキーマをサポートします。

いくつかの機能について

  • XSDスキーマまたはXMLファイルから柔軟なC#またはVisual Basicコードにビジネスオブジェクトを生成します。
  • サポートフレームワーク2.0から4.x
  • 厳密に型指定されたコレクション(List、ObservableCollection、MyCustomCollection)をサポートします。
  • 自動プロパティをサポートします。
  • XMLの読み書きメソッド(シリアライゼーション/デシリアライゼーション)を生成します。
  • データバインディングのサポート(WPF、Xamarin).
  • WCF(DataMember属性).
  • XMLエンコーディングのサポート(UTF-8/32、ASCII、Unicode、カスタム)。
  • キャメルケース/パスカルケース対応。
  • 制限サポート([StringLengthAttribute = true/false]、[RegularExpressionAttribute = true/false]、[RangeAttribute = true/false])。
  • 大きくて複雑なXSDファイルをサポートします。
  • DotNet Coreと標準のサポート
0
Haas Franck