5

XMLシリアライゼーションに関するマイクロソフトのチュートリアルに従おうとしていますが、いくつかの問題が発生しています!!

これは、入力として使用される XML ファイルです。

<?xml version="1.0" encoding="utf-8"?>
<Books xmlns:books="http://www.cpandl.com" xmlns:money="http://www.cohowinery.com">
  <money:Book>
    <books:TITLE>A Book Title</books:TITLE>
    <money:PRICE books:currency="US Dollar">
      <money:price>9.95</money:price>
    </money:PRICE>
  </money:Book>
</Books>

これは、XML をバインドするクラスです。

public class OrderedItem
{
        [XmlElement(Namespace = "http://www.cpandl.com")]
        public string ItemName;
        [XmlElement(Namespace = "http://www.cpandl.com")]
        public string Description;
        [XmlElement(Namespace = "http://www.cohowinery.com")]
        public decimal UnitPrice;
        [XmlElement(Namespace = "http://www.cpandl.com")]
        public int Quantity;
        [XmlElement(Namespace = "http://www.cohowinery.com")]
        public decimal LineTotal;
        // A custom method used to calculate price per item.
        public void Calculate()
        {
            LineTotal = UnitPrice * Quantity;
        }
    }

この関数は、XML を「OrderedItem」クラスに読み込みます。

Console.WriteLine("Reading with Stream");

// Create an instance of the XmlSerializer.
var serializer = new XmlSerializer(typeof(OrderedItem));

// Reading the XML document requires a FileStream.
Stream reader = new FileStream(filename, FileMode.Open);

// Declare an object variable of the type to be deserialized.
// Call the Deserialize method to restore the object's state.
var i = (OrderedItem)serializer.Deserialize(reader);

Console.SetOut(new StreamWriter("a_output.xml"));
serializer.Serialize(Console.Out, i);

これは、読み取って書き直した後の XML です。

<?xml version="1.0" encoding="utf-8"?>
<OrderedItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ItemName xmlns="http://www.cpandl.com">Widget</ItemName>
  <Description xmlns="http://www.cpandl.com">Regular Widget</Description>
  <UnitPrice xmlns="http://www.cohowinery.com">2.3</UnitPrice>
  <Quantity xmlns="http://www.cpandl.com">10</Quantity>
  <LineTotal xmlns="http://www.cohowinery.com">23</LineTotal>
</OrderedItem>

ご覧のとおり、名前空間が展開されています。uri の代わりに名前空間ラベルを使用して同じ XML を取得するには、出力をどのように記述すればよいですか?

4

4 に答える 4

2

XmlSerializerNameSpacesクラスを確認してください: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializernamespaces.aspx

このコード例は、トリックを行う必要があります。

  XmlSerializer s = new XmlSerializer(typeof(OrderedItem));
  XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
  ns.Add("books", "http://www.cpandl.com");
  ns.Add("money", "http://www.cohowinery.com");    
  s.Serialize(new StreamWriter("a_output.xml"), i, ns);
于 2011-01-29T18:52:42.653 に答える
1

XmlSerializerNamespacesでマークされたtype のメンバーを追加する必要がありますXmlNamespaceDeclarationsAttribute

public class OrderedItem
{
  [XmlNamespaceDeclarations]
  public XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();

  ...
}

そして、シリアル化するときに名前空間宣言を追加します。

OrderedItem item = new OrderedItem();
item.xmlns.Add("books", "http://www.cpandl.com");
item.xmlns.Add("money", "http://www.cohowinery.com"); 
XmlSerializer serializer = new XmlSerializer(typeof(OrderedItem));
...
于 2011-01-29T18:56:05.767 に答える
0

オブジェクトをシリアル化するためのオーバーロードされたメソッドを見たいと思うかもしれません:

デフォルトのシリアル化

シリアル化のための名前空間の定義

XmlSerializerNamespacesそこで述べたように、次のコード行で定義できます。

    // Create an XmlSerializerNamespaces object.
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

    // Add two prefix-namespace pairs.
    ns.Add("inventory", "http://www.cpandl.com");
    ns.Add("money", "http://www.cohowinery.com");

それが役立つことを願っています。

于 2011-01-29T18:49:28.380 に答える
0

オブジェクトを上記の形式にシリアル化するには、オブジェクトにIXmlSerializableインターフェイスを実装する必要があります ( MSDN ドキュメント)。このインターフェイスを使用すると、クラスのシリアル化された結果を完全に制御できるメソッドを実装できます (また、xml をオブジェクトに逆シリアル化します)。

このトピックはここでも議論されています。詳細については、こちらを参照してください: IXmlSerializable を実装する適切な方法

于 2011-01-29T18:50:03.400 に答える