私はソケットを介してXML文字列を受信しているので、これらをC#オブジェクトに変換したいと思います。
メッセージは以下の形式です。
<msg>
<id>1</id>
<action>stop</action>
</msg>
私は.Netに慣れていないので、これを実行するためのベストプラクティスはわかりません。私は以前はJAXB for Javaを使っていましたが、似たようなものがあるのか、それとも別の方法で処理されるのかはわかりませんでした。
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);
このメソッドを試して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);
管理者としてVisual Studio 2013を実行する... Xmlファイルの内容をコピーします。Visual Studio 2013>編集>形式を選択して貼り付け> XmlをC#クラスとして貼り付けに進みますXmlファイルの内容に従ってc#クラスを作成します。
万が一誰かがこれを役に立つと思うかもしれません:
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);
上記のようにクラスを生成するか、手動で書くことができます。
[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);
このシリアライザのサポート:
ExtendedXmlSerializerのサポート.NET 4.5以上および.NET Core。あなたはそれをWebApiとAspCoreと統合することができます。
Xsd.exeを使用して、.NETでスキーマバインドクラスを作成し、次にXmlSerializerで文字列をデシリアライズすることができます。 http://msdn.Microsoft.com/ja-jp/library/system.xml。 serialization.xmlserializer.deserialize.aspx
Xmlメッセージのxsdがある場合は、.Net xsd.exeツールを使用してC#クラスを生成できます。
この.NETクラスはxmlの生成に使用できます。
私はこの質問が古いことを知っていますが、私はそれに出くわし、他の皆とは違う答えを持っています:-)
通常の方法(上記のコメンターが述べているように)は、クラスを生成し、xmlを逆シリアル化することです。
しかし、(警告:ここで恥知らずな自己宣伝)私はちょうどあなたがしないナゲットパッケージ、 here を公開しましたする必要がある。あなただけ行く:
string xml = System.IO.File.ReadAllText(@"C:\test\books.xml");
var book = Dandraka.XmlUtilities.XmlSlurper.ParseText(xml);
それは文字通りそれであり、他に何も必要ありません。そして、最も重要なのは、xmlが変更された場合、オブジェクトも自動的に変更されることです。
Dllを直接ダウンロードする場合、githubページは here です。
ここでの他の答えに加えて、XML DOMのような読み取りには XmlDocument クラス、早送り専用の XmlReader クラスを使用することも当然可能です。」手で"。
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);
}
}
高度なxsdからc#クラスへの生成ツール別の方法:xsd2code.com。このツールはとても便利で強力です。 Visual Studioのxsd.exeツールよりもはるかにカスタマイズが豊富です。 Xsd2Code ++は、リストまたは配列を使用するようにカスタマイズでき、多数のImportステートメントを含む大規模スキーマをサポートします。
いくつかの機能について