ソケットを介してXML文字列を受信していますが、これらをC#オブジェクトに変換したいと考えています。
メッセージの形式は次のとおりです。
<msg>
<id>1</id>
<action>stop</action>
</msg>
私は.Netを初めて使用するので、これを実行するためのベストプラクティスがわかりません。以前にJAXB for Javaを使用したことがあり、同様のものがあるかどうか、またはこれが別の方法で処理されるかどうかはわかりませんでした。
ソケットを介してXML文字列を受信していますが、これらをC#オブジェクトに変換したいと考えています。
メッセージの形式は次のとおりです。
<msg>
<id>1</id>
<action>stop</action>
</msg>
私は.Netを初めて使用するので、これを実行するためのベストプラクティスがわかりません。以前にJAXB for Javaを使用したことがあり、同様のものがあるかどうか、またはこれが別の方法で処理されるかどうかはわかりませんでした。
回答:
xsd.exe
Windows SDKとともに次のようなディレクトリにインストールされるツールを使用する必要があります。
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);
2つの可能性があります。
C:\path\to\xml\file.xml
Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
あなただけの入力を開始することができますWindows 8の持っている場合、または開発者のコマンドプロンプトでのスタート画面cd /D "C:\path\to\xml"
xsd file.xml
xsd /c file.xsd
以上です!xmlファイルからC#クラスを生成しましたC:\path\to\xml\file.cs
Edit > Paste special > Paste XML As Classes
以上です!
このヘルパークラスを使用すると、使用法は非常に簡単です。
using System;
using System.IO;
using System.Web.Script.Serialization; // Add reference: System.Web.Extensions
using System.Xml;
using System.Xml.Serialization;
namespace Helpers
{
internal static class ParseHelpers
{
private static JavaScriptSerializer json;
private static JavaScriptSerializer JSON { get { return json ?? (json = new JavaScriptSerializer()); } }
public static Stream ToStream(this string @this)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(@this);
writer.Flush();
stream.Position = 0;
return stream;
}
public static T ParseXML<T>(this string @this) where T : class
{
var reader = XmlReader.Create(@this.Trim().ToStream(), new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
return new XmlSerializer(typeof(T)).Deserialize(reader) as T;
}
public static T ParseJSON<T>(this string @this) where T : class
{
return JSON.Deserialize<T>(@this.Trim());
}
}
}
あなたが今しなければならないすべては、です:
public class JSONRoot
{
public catalog catalog { get; set; }
}
// ...
string xml = File.ReadAllText(@"D:\file.xml");
var catalog1 = xml.ParseXML<catalog>();
string json = File.ReadAllText(@"D:\file.json");
var catalog2 = json.ParseJSON<JSONRoot>();
このメソッドを試して、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ファイルのコンテンツをコピーします。VisualStudio 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/en-us/library/system.xml.serialization.xmlserializer.deserialize.aspx
DTOをCustomObjectとして作成する
以下のメソッドを使用して、JAXBを使用してXML文字列をDTOに変換します
private static CustomObject getCustomObject(final String ruleStr) {
CustomObject customObject = null;
try {
JAXBContext jaxbContext = JAXBContext.newInstance(CustomObject.class);
final StringReader reader = new StringReader(ruleStr);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
customObject = (CustomObject) jaxbUnmarshaller.unmarshal(reader);
} catch (JAXBException e) {
LOGGER.info("getCustomObject parse error: ", e);
}
return customObject;
}
ここでの他の回答に加えて、XML DOMのような読み取りのためのXmlDocumentクラス、または高速順方向専用リーダーであるXmlReaderを自然に使用して、「手動」でそれを行うことができます。
高度なxsdからc#クラス生成ツールを使用する別の方法:xsd2code.com。このツールは非常に便利で強力です。Visual Studioのxsd.exeツールよりも多くのカスタマイズが可能です。Xsd2Code ++は、リストまたは配列を使用するようにカスタマイズでき、多数のImportステートメントを含む大規模なスキーマをサポートします。
いくつかの機能のメモ、
私はこの質問が古いことを知っていますが、私はそれに出くわしました、そして私は、まあ、他の皆とは異なる答えを持っています:-)
通常の方法(上記のコメンターによる)は、クラスを生成してxmlを非直列化することです。
しかし、(警告:ここでは恥知らずな自己宣伝)私はここで、あなたが必要としないnugetパッケージを公開しました。あなたはただ行く:
string xml = System.IO.File.ReadAllText(@"C:\test\books.xml");
var book = Dandraka.XmlUtilities.XmlSlurper.ParseText(xml);
それは文字通りそれだけで、他には何も必要ありません。そして、最も重要なのは、xmlが変更されると、オブジェクトも自動的に変更されることです。
public string Serialize<T>(T settings)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringWriter outStream = new StringWriter();
serializer.Serialize(outStream, settings);
return outStream.ToString();
}