オブジェクトをシリアル化するときにXML処理命令を省略する
-
03-07-2019 - |
質問
C#VS2003 / .Net 1.1アプリケーションでオブジェクトをシリアル化しています。ただし、処理命令なしでシリアル化する必要があります。 XmlSerializerクラスは次のようなものを出力します。
<?xml version="1.0" encoding="utf-16" ?>
<MyObject>
<Property1>Data</Property1>
<Property2>More Data</Property2>
</MyObject>
結果のテキストを処理してタグを削除せずに、次のようなものを取得する方法はありますか?
<MyObject>
<Property1>Data</Property1>
<Property2>More Data</Property2>
</MyObject>
好奇心are盛な人のために、私のコードは次のようになります...
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
using ( TextWriter stringWriter = new StringWriter(builder) )
{
serializer.Serialize(stringWriter, comments);
return builder.ToString();
}
解決
次のリンクは、XmlWriterを使用して処理命令を抑制し、「開始」状態ではなく「要素」状態にする方法がある投稿に移動します。これにより、処理命令が書き込まれなくなります。
XmlWriterをシリアライザーに渡すと、処理のみが発行されます XmlWriterの状態が「開始」の場合(つまり、何もなかった場合) まだ書かれています)。
// Assume we have a type named 'MyType' and a variable of this type named
'myObject'
System.Text.StringBuilder output = new System.Text.StringBuilder();
System.IO.StringWriter internalWriter = new System.IO.StringWriter(output);
System.Xml.XmlWriter writer = new System.Xml.XmlTextWriter(internalWriter);
System.Xml.Serialization.XmlSerializer serializer = new
System.Xml.Serialization.XmlSerializer(typeof(MyType));
writer.WriteStartElement("MyContainingElement");
serializer.Serialize(writer, myObject);
writer.WriteEndElement();
この場合、ライターは「要素」(要素内)の状態になります そのため、処理命令は書き込まれません。書き終えたもの XML、基礎となるストリームからテキストを抽出して処理することができます あなたの心のコンテンツ。
他のヒント
少し修正しました
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
using ( XmlWriter stringWriter = XmlWriter.Create(builder, settings) )
{
serializer.Serialize(stringWriter, comments);
return builder.ToString();
}
2.0では、 XmLWriterSettings.OmitXmlDeclaration 、およびXmlWriterへのシリアル化-ただし、これは1.1には存在しないと思います。したがって、完全に便利ではありませんが、もう1つ「アップグレードを検討してください」事...そしてはい、私はそれが常に可能ではないことを理解しています。
名前空間の省略はどうですか?
使用する代わりに
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add("", "");
ex:
<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
「処理命令」による場合xml宣言を意味する場合、XmlWriterSettingsのOmitXmlDeclarationプロパティを設定することでこれを回避できます。これを実現するには、XmlWriterを使用してシリアル化する必要があります。
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
using ( XmlWriter stringWriter = new StringWriter(builder, settings) )
{
serializer.Serialize(stringWriter, comments);
return builder.ToString();
}
しかし、これは1.1の質問には答えません。まあ、他の人への参照のため。
これは.NET 1.1で機能します。 (ただし、アップグレードを検討する必要があります)
XmlSerializer s1= new XmlSerializer(typeof(MyClass));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add( "", "" );
MyClass c= new MyClass();
c.PropertyFromDerivedClass= "Hallo";
sw = new System.IO.StringWriter();
s1.Serialize(new XTWND(sw), c, ns);
....
/// XmlTextWriterFormattedNoDeclaration
/// helper class : eliminates the XML Documentation at the
/// start of a XML doc.
/// XTWFND = XmlTextWriterFormattedNoDeclaration
public class XTWFND : System.Xml.XmlTextWriter
{
public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; }
public override void WriteStartDocument() { }
}