2008-08-25 30 views
15

Tôi sử dụng công nghệ XML XML khá rộng rãi trong công việc của mình. Một trong những điều tôi thích nhất là động cơ XSLT, chính xác hơn khả năng mở rộng của nó. Tuy nhiên có một mảnh nhỏ mà giữ được một nguồn gây phiền nhiễu. Không có gì lớn hoặc một cái gì đó chúng ta không thể sống với nhưng nó ngăn cản chúng ta tạo ra XML đẹp mà chúng ta muốn sản xuất.Quản lý không gian tên thích hợp trong .NET XmlWriter

Một trong những điều chúng tôi làm là chuyển đổi các nút nội tuyến và nhập các nút từ một tài liệu XML sang một tài liệu XML khác.

Đáng buồn thay, khi bạn lưu các nút vào một số XmlTextWriter (thực tế là bất kỳ giá trị nào XmlWriter.Create(Stream) trả về), các định nghĩa không gian tên đều được ném vào đó, bất kể nó là cần thiết (đã được xác định trước) hay không. Bạn nhận được loại xml sau đây:

<root xmlns:abx="http://bladibla"> 
    <abx:child id="A"> 
     <grandchild id="B"> 
      <abx:grandgrandchild xmlns:abx="http://bladibla" /> 
     </grandchild> 
    </abx:child> 
</root> 

Có ai có đề xuất cách thuyết phục .NET có hiệu quả về định nghĩa không gian tên của nó không?

Xin cảm ơn, Boaz

PS. Là một phần thưởng thêm, tôi muốn ghi đè lên không gian tên mặc định, thay đổi nó khi tôi viết một nút.

Trả lời

0

This bài đăng có thể hữu ích. Ngoài ra, hãy xem Không gian tên thuộc tính của các lớp XmlTextWriter \ XmlTextReader.

+0

'XmlTextReader' và' XmlTextWriter' được về cơ bản khấu hao, và không thể được sử dụng trực tiếp nếu bạn đang làm việc với các 'phương pháp Create' khuyến khích. Dù sao thì, đây là lúc tôi thêm tiền thưởng, vì vậy tôi hy vọng nó không đủ điều kiện. Nó không trả lời câu hỏi, được viết hoàn toàn như vậy, * viz *, "cách thuyết phục .NET để có hiệu quả về các định nghĩa không gian tên của nó." Tôi cho rằng điều đó chỉ có thể thực hiện được thông qua một người đọc hoặc người viết tùy chỉnh, nhưng đó là một hack nếu có một giải pháp riêng. – harpo

1

Tôi không chắc chắn đây là những gì bạn đang tìm kiếm, nhưng bạn có thể sử dụng loại mã này khi bạn bắt đầu viết vào dòng Xml:

myWriter.WriteAttributeString("xmlns", "abx", null, "http://bladibla"); 

Các XmlWriter nên nhớ nó và không viết lại nó nữa. Nó có thể không được 100% chống đạn, nhưng nó hoạt động hầu hết thời gian.

+0

Nó nên, nhưng nó không. Chỉ để giữ chân tôi ra khỏi miệng, mặc dù bây giờ tôi sẽ kiểm tra lại. – harpo

14

Sử dụng mã này:

using (var writer = XmlWriter.Create("file.xml")) 
{ 
    const string Ns = "http://bladibla"; 
    const string Prefix = "abx"; 

    writer.WriteStartDocument(); 

    writer.WriteStartElement("root"); 

    // set root namespace 
    writer.WriteAttributeString("xmlns", Prefix, null, Ns); 

    writer.WriteStartElement(Prefix, "child", Ns); 
    writer.WriteAttributeString("id", "A"); 

    writer.WriteStartElement("grandchild"); 
    writer.WriteAttributeString("id", "B"); 

    writer.WriteElementString(Prefix, "grandgrandchild", Ns, null); 

    // grandchild 
    writer.WriteEndElement(); 
    // child 
    writer.WriteEndElement(); 
    // root 
    writer.WriteEndElement(); 

    writer.WriteEndDocument(); 
} 

Mã này tạo ra kết quả mong muốn:

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns:abx="http://bladibla"> 
    <abx:child id="A"> 
    <grandchild id="B"> 
     <abx:grandgrandchild /> 
    </grandchild> 
    </abx:child> 
</root> 
+0

Thay đổi điều đó để sử dụng 'XmlWriter.Create' và tôi sẽ upvote nó. –

+0

@John: Xong. Nhưng vấn đề là gì? Tỷ lệ cược là gì? –

+4

@polish: tỷ lệ cược? Ý anh là gì? Vấn đề là mọi người sao chép/dán các ví dụ của chúng tôi, và không ai nên sử dụng 'new XmlTextWriter' như của .NET 2.0. –

1

Bạn thử này?

Dim settings = New XmlWriterSettings With {.Indent = True, 
              .NamespaceHandling = NamespaceHandling.OmitDuplicates, 
              .OmitXmlDeclaration = True} 
Dim s As New MemoryStream 
Using writer = XmlWriter.Create(s, settings) 
    ... 
End Using 

Thú vị là 'NamespaceHandling.OmitDuplicates'

+0

Thật thú vị. Tôi đang ở trong NET 2.0, mặc dù. – harpo

+0

@harpo: Đó là .Net 2.0 (xem http://msdn.microsoft.com/de-de/library/ms162617%28v=vs.80%29.aspx) – habakuk

+0

'XmlWriterSettings' là, nhưng' NamespaceHandling' tài sản thì không. http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.namespacehandling%28v=VS.100%29.aspx – harpo

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