2010-12-02 28 views
8

chuyển loại mã này:ImportNode tạo xmlns trống thuộc tính

var tmpNewNode = xdoc.ImportNode(newNode, true); 

    if (oldNode.ParentNode != null) 
    { 
     oldNode.ParentNode.ReplaceChild(tmpNewNode, oldNode); 
     return true; 
    } 

tmpNewNode được tạo ra với xmlns thuộc tính rỗng (xmlns = ""). Bất kỳ đề nghị làm thế nào tôi có thể tránh nó?

10x

+0

Tại sao xmlns lại thuộc tính cho bạn? –

+0

Tôi đang thực hiện so sánh chuỗi. Tôi phải tránh nó được tạo ra. – Guy

+0

'newNode' được tạo như thế nào? – Richard

Trả lời

8

gì có thể xảy ra ở đây là newNode xuất phát từ một tài liệu với không gian tên tuyên bố, nhưng oldNode là trong một tài liệu với một không gian tên. Trong tình huống này, nút lấy không gian tên trống của nó sang tài liệu mới và nó hiển thị rõ ràng. Thành thật mà nói, nếu nó chỉ là một vấn đề cho một so sánh chuỗi, nó sẽ không làm tổn thương để chỉ cần loại bỏ tất cả các trường hợp của xmlns = "" từ chuỗi XML trước khi bạn làm việc với nó.

+0

+1: Sử dụng 'String.Replace' để loại bỏ' xmlns = "" 'cảm thấy hơi khó xử với tôi, nhưng không nhiều hơn so với việc sử dụng so sánh chuỗi thô trên một chuỗi XML. – Brian

+0

Đồng ý, đó là một chút mùi mã, nhưng cố gắng thực hiện so sánh từng nút của hai cây XML là PITA, vì vậy tôi có thể thấy lý do tại sao so sánh OuterXML có thể thích hợp hơn. – MarkXA

+1

Giải pháp xấu xí, nhưng tôi đoán nó hoạt động ... Tôi đã gặp vấn đề tương tự trong PowerShell. Trong trường hợp của tôi, việc tự động hóa chống lại các API của Microsoft Azure có nghĩa là 'xmlns =" ​​"' thực sự phá vỡ xác nhận hợp lệ của tài liệu XML. –

-1

add namespace mặc định để xdoc bạn

0

Dọc theo dòng gì MarkXA said:

gì có thể xảy ra ở đây là newNode xuất phát từ một tài liệu với không namespace tuyên bố, nhưng oldNode là trong một tài liệu với một không gian tên. Trong trường hợp này , nút mất không gian tên trống đối với tài liệu mới và nó hiển thị rõ ràng.

Bạn có thể thao tác Chuỗi với mục đích so sánh nhưng các nút trong DOM của bạn sẽ không phải là không gian tên đủ điều kiện có thể gây ra sự cố sau này nếu bạn cố gắng sử dụng nó.

Giải pháp chính xác là xây dựng newNode với tiêu chuẩn không gian tên thích hợp ngay từ đầu. Bởi trình độ không gian tên thích hợp, tôi có nghĩa là các không gian tên được sử dụng trong DOM nhập.

0

Tôi có vấn đề sames khi tôi tạo một XmlElement như đây

XmlElement xmlElement = myXmlDocument.CreateElement("MyElemenent"); 
myXmlDocument.AppendChild(xmlElement); 

sau này tôi có các thuộc tính xmlns = "" sau khi tiết kiệm.

Nếu tôi sử dụng không gian tên của tài liệu tôi có thể chặn thuộc tính xmlns này.

XmlElement xmlElement = myXmlDocument.CreateElement("MyElemenent",myXmlDocument.DocumentElement.NamespaceURI); 
myXmlDocument.AppendChild(xmlElement); 

Nếu không có rỗng xmlns = "" SelectNodes của tôi không hoạt động nữa vì không gian tên cần được chỉ định. Giải pháp cho điều này là here (using-xpath-with-default-namespace)

0

Hãy thử:

oldNode.InnerXml = tmpNewNode.InnerXml 
0

Cuối cùng tôi giải quyết file xml khai mạc này và thay thế tất cả ocurrences của xmlns "" với một chuỗi rỗng.

Có lẽ giải pháp không thanh lịch nhưng nó đơn giản và hoạt động tốt.

//remove void xmlns 
File.WriteAllText(filename, Regex.Replace(File.ReadAllText(filename), "xmlns=\"\"", "")); 
Các vấn đề liên quan