2010-02-12 36 views
5

Tôi cần có khả năng xác định thuộc tính với tiền tố trong phần tử xml.Cách tạo thuộc tính XmlElement bằng tiền tố?

Ví dụ ...

<nc:Person s:id="ID_Person_01"></nc:Person> 

Để làm được điều này mặc dù tôi rằng sau đây sẽ làm việc.

XmlElement TempElement = XmlDocToRef.CreateElement("nc:Person", "http://niem.gov/niem/niem-core/2.0"); 
TempElement.SetAttribute("s:id", "http://niem.gov/niem/structures/2.0", "ID_Person_01"); 

Thật không may, XmlElement.SetAttribute (string, string,) dường như không hỗ trợ phân tích tiền tố khi tôi nhận được lỗi bên dưới.

Ký tự ':', giá trị thập lục phân 0x3A, không được bao gồm trong tên.

Làm cách nào để xác định thuộc tính có tiền tố?

Trả lời

16

Nếu bạn đã khai báo không gian tên của bạn trong nút gốc, bạn chỉ cần thay đổi cuộc gọi SetAttribute để sử dụng tên thuộc tính chưa được sửa lại. Vì vậy, nếu nút gốc của bạn định nghĩa một không gian tên như thế này:

<People xmlns:s='http://niem.gov/niem/structures/2.0'> 

Bạn có thể làm điều này và các thuộc tính sẽ đón tiếp đầu ngữ mà bạn đã thiết lập:

// no prefix on the first argument - it will be rendered as 
// s:id='ID_Person_01' 
TempElement.SetAttribute("id", "http://niem.gov/niem/structures/2.0", "ID_Person_01"); 

Nếu bạn chưa tuyên bố namespace (và tiền tố của nó), sự quá tải ba chuỗi XmlDocument.CreateAttribute sẽ làm điều đó cho bạn:

// Adds the declaration to your root node 
var attribute = xmlDocToRef.CreateAttribute("s", "id", "http://niem.gov/niem/structures/2.0"); 
attribute.InnerText = "ID_Person_01" 
TempElement.SetAttributeNode(attribute); 
+0

Điều này làm việc. Tôi đã có tiền tố từ đối số đầu tiên của – Eddie

+1

Rất hữu ích Một điều nhỏ - có một toán tử equals/assignment thiếu 'XmlAttribute attribute = xmlDocToRef.' –

1

Hãy thử tạo thuộc tính trực tiếp và thêm nó vào phần tử:

XmlAttribute attr = XmlDocToRef.CreateAttribute("s", "id", "http://niem.gov/niem/structures/2.0"); 
attr.InnerText = "ID_Person_01"; 
TempElement.Attributes.Append(attr); 
2

Phương thức XMLDocument.CreateAttribute có thể mất 3 chuỗi: Tiền tố được chỉ định, tên cục bộ và không gian tên. Sau đó, bạn có thể thêm thuộc tính vào phần tử. Một cái gì đó như thế này có thể làm việc cho bạn:

XmlAttribute newAttribute = XmlDocToRef.CreateAttribute("s", "id", "http://niem.gov/niem/structures/2.0"); 
TempElement.Attributes.Append(newAttribute): 
0

Kể từ tìm kiếm của tôi đã giữ lấy tôi ở đây, tôi sẽ trả lời này cho XElement. Tôi không biết nếu giải pháp này cũng hợp lệ cho XmlElement, nhưng hy vọng ít nhất sẽ giúp người khác sử dụng XElement, người sẽ kết thúc ở đây.

Dựa trên this Tôi đã thêm xml:space="preserve" vào tất cả các nút dữ liệu trong một số mẫu, trước khi tra cứu và thêm nội dung của chúng. Đó là mã IMO lạ (Tôi thích ba thông số như được hiển thị ở trên, nhưng nó thực hiện công việc:

foreach (XElement lElement in root.Descendants(myTag)) 
{ 
     lElement.Add(new XAttribute(root.GetNamespaceOfPrefix("xml") + "space", "preserve")); 
} 
Các vấn đề liên quan