2011-08-02 24 views
5

Với đoạn mã sau:XmlSerializer trong .NET với XmlSchemaForm.Unqualified

using System; 
using System.Xml.Schema; 
using System.Xml.Serialization; 

namespace XmlSerializationTest 
{ 
    [XmlType(Namespace = "http://www.test.com")] 
    public class Element 
    { 
     [XmlElement] 
     public int X; 
    } 

    [XmlRoot(Namespace = "http://www.test.com")] 
    public class Root 
    { 
     [XmlElement(Form = XmlSchemaForm.Unqualified)] 
     public Element Element; 
    } 

    public static class Program 
    { 
     public static void Main(string[] args) 
     { 
      var root = new Root { Element = new Element { X = 1 } }; 
      var xmlSerializer = new XmlSerializer(typeof(Root)); 
      xmlSerializer.Serialize(Console.Out, root); 
     } 
    } 
} 

đầu ra là:

<?xml version="1.0" encoding="ibm852"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.test.com"> 
    <Element xmlns=""> 
    <X xmlns="http://www.test.com">1</X> 
    </Element> 
</Root> 

Câu hỏi là tại sao không thiết lập thuộc tính Form để XmlSchemaForm.Unqualified nguyên nhân các Element không gian tên của phần tử được đặt thành "" ngay cả khi nó có thuộc tính XmlTypeAttribute có cùng một không gian tên như phần tử Gốc?

Loại mã này (phần XmlSchemaForm.Unqualified) được tạo bởi công cụ WSCF.blue và nó gây rối với không gian tên.

+0

"không đủ tiêu chuẩn" chỉ ra rằng các thuộc tính từ namespace mục tiêu không cần thiết để đủ điều kiện với tiền tố namespace. Vì vậy, đó là lý do tại sao bạn nhận được xmlns = "" nếu được đặt thành đủ điều kiện của nó. Như bạn đã nói từ một công cụ tự động. xem có các tùy chọn cấu hình trong công cụ không. – Aravind

+0

@Aravind: Tôi nghĩ rằng unqualified có nghĩa là serializer không bị buộc phải sử dụng tiền tố (nó có thể hoặc có thể không). Nhưng tôi không thấy lý do tại sao nó sẽ đổi tên của phần tử Element (từ "http://www.test.com" thành "")! Thật không may WSCF.blue dường như không có chuyển đổi phù hợp để sửa lỗi đó. – Stefan

Trả lời

0

Bạn có thể ghi đè vùng tên được chỉ định trong loại phần tử. Ví dụ. bạn có thể có

[XmlElement(Namespace="http://foo.com")] 
public Element Element; 

Và kết quả sẽ là

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.test.com"> 
    <Element xmlns="http://foo.com"> 
    <X xmlns="http://www.test.com">1</X> 
    </Element> 
</Root> 

thi hành Form = XmlSchemaForm.Unqualified của Microsoft dường như là chính xác tương đương với thiết Namespace để "". Đặc biệt, nó không thể được sử dụng nếu bạn chỉ định rõ ràng bất kỳ không gian tên nào khác (MSDN reference). Nếu bạn làm thế, bạn sẽ nhận được ngoại lệ này:

Unhandled Exception: System.InvalidOperationException: There was an error reflecting type 'XmlSerializationTest.Root'. ---> System.InvalidOperationException: There was an error reflecting field 'Element'. ---> System.InvalidOperationException: The Form property may not be 'Unqualified' when an explicit Namespace property is present.

Các vấn đề liên quan