10

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>

興味のある方のために、私のコードは次のようになります...

XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();

using ( TextWriter stringWriter = new StringWriter(builder) )
{
    serializer.Serialize(stringWriter, comments);
    return builder.ToString();
}
4

6 に答える 6

10

微修正しました

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();
}
于 2008-11-26T20:47:05.900 に答える
7

2.0 では、XmLWriterSettings.OmitXmlDeclarationを使用し、XmlWriter にシリアル化しますが、これは 1.1 には存在しないと思います。完全に役立つわけではありませんが、「アップグレードを検討する」ことをもう1つだけ...そして、はい、常に可能であるとは限りません.

于 2008-10-02T21:03:52.387 に答える
3

次のリンクは、誰かが 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 の記述が完了したら、基になるストリームからテキストを抽出し、心ゆくまで処理できます。

于 2008-10-02T21:06:02.600 に答える
1

名前空間を省略するとどうなりますか?

使用する代わりに

XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
                namespaces.Add("", "");

元:

<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
于 2009-03-09T11:48:30.883 に答える
0

「処理命令」が 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 に関するあなたの質問には答えません。まぁ、他の方の参考までに。

于 2008-10-02T21:05:01.527 に答える
0

これは .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() { }
   }
于 2009-02-26T10:51:17.617 に答える