Có cách nào để tôi sắp xếp một đối tượng trong .NET mà không có Không gian tên XML tự động tuần tự hóa không? Dường như theo mặc định .NET tin rằng không gian tên XSI và XSD nên được bao gồm, nhưng tôi không muốn chúng ở đó.Làm thế nào để tuần tự hóa một đối tượng thành XML mà không nhận xmlns = "..."?
Trả lời
Ahh ... nevermind. Nó luôn luôn là tìm kiếm sau khi câu hỏi được đặt ra rằng mang lại câu trả lời. Đối tượng của tôi đang được tuần tự hóa là obj
và đã được xác định. Thêm một XMLSerializerNamespace với một không gian tên trống duy nhất cho bộ sưu tập hiện các trick.
Trong VB như thế này:
Dim xs As New XmlSerializer(GetType(cEmploymentDetail))
Dim ns As New XmlSerializerNamespaces()
ns.Add("", "")
Dim settings As New XmlWriterSettings()
settings.OmitXmlDeclaration = True
Using ms As New MemoryStream(), _
sw As XmlWriter = XmlWriter.Create(ms, settings), _
sr As New StreamReader(ms)
xs.Serialize(sw, obj, ns)
ms.Position = 0
Console.WriteLine(sr.ReadToEnd())
End Using
trong C# như thế này:
//Create our own namespaces for the output
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
//Add an empty namespace and empty value
ns.Add("", "");
//Create the serializer
XmlSerializer slz = new XmlSerializer(someType);
//Serialize the object with our own namespaces (notice the overload)
slz.Serialize(myXmlTextWriter, someObject, ns);
Nếu bạn muốn thoát khỏi thêm các xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
và xmlns:xsd="http://www.w3.org/2001/XMLSchema"
, nhưng vẫn giữ namespace của riêng bạn xmlns="http://schemas.YourCompany.com/YourSchema/"
, bạn sử dụng cùng mã như trên ngoại trừ thay đổi đơn giản này:
// Add lib namespace with empty prefix
ns.Add("", "http://schemas.YourCompany.com/YourSchema/");
Liên kết đó bị hỏng –
Nếu bạn không thể thoát khỏi xmlns thêm thuộc tính cho mỗi phần tử, khi serializing để xml từ các lớp được tạo ra (ví dụ: khi xsd.exe đã được sử dụng), vì vậy bạn có cái gì đó như:
<manyElementWith xmlns="urn:names:specification:schema:xsd:one" />
sau đó tôi sẽ chia sẻ với bạn những gì làm việc cho tôi (một hỗn hợp các câu trả lời trước đó và những gì tôi tìm thấy here)
thiết lập một cách rõ ràng tất cả xmlns khác nhau của bạn như sau:
Dim xmlns = New XmlSerializerNamespaces()
xmlns.Add("one", "urn:names:specification:schema:xsd:one")
xmlns.Add("two", "urn:names:specification:schema:xsd:two")
xmlns.Add("three", "urn:names:specification:schema:xsd:three")
sau đó vượt qua nó để serialize
serializer.Serialize(writer, object, xmlns);
bạn sẽ có ba không gian tên được khai báo trong phần tử gốc và không có nhiều việc cần phải được tạo ra trong các yếu tố khác mà sẽ có tiền tố phù hợp
<root xmlns:one="urn:names:specification:schema:xsd:one" ... />
<one:Element />
<two:ElementFromAnotherNameSpace /> ...
tôi Suggest lớp helper này:
public static class Xml
{
#region Fields
private static readonly XmlWriterSettings WriterSettings = new XmlWriterSettings {OmitXmlDeclaration = true, Indent = true};
private static readonly XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")});
#endregion
#region Methods
public static string Serialize(object obj)
{
if (obj == null)
{
return null;
}
return DoSerialize(obj);
}
private static string DoSerialize(object obj)
{
using (var ms = new MemoryStream())
using (var writer = XmlWriter.Create(ms, WriterSettings))
{
var serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(writer, obj, Namespaces);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
public static T Deserialize<T>(string data)
where T : class
{
if (string.IsNullOrEmpty(data))
{
return null;
}
return DoDeserialize<T>(data);
}
private static T DoDeserialize<T>(string data) where T : class
{
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(data)))
{
var serializer = new XmlSerializer(typeof (T));
return (T) serializer.Deserialize(ms);
}
}
#endregion
}
:)
câu trả lời tuyệt vời :) tôi cũng đã thêm dòng này ** stream.Position = 0; ** và trả về toàn bộ luồng trong giải pháp của tôi .. hoạt động như mong đợi - tất cả các thẻ giảm tốc đã bị xóa – ymz
Nếu bạn muốn loại bỏ không gian tên, bạn cũng có thể muốn xóa phiên bản, để lưu bạn tìm kiếm tôi đã thêm chức năng đó để mã bên dưới sẽ thực hiện cả hai.
Tôi cũng đã bọc nó theo một phương pháp chung vì tôi đang tạo các tệp xml rất lớn, quá lớn để tuần tự hóa trong bộ nhớ, vì vậy tôi đã chia nhỏ tệp đầu ra của mình và sắp xếp nó thành các phần nhỏ hơn:
public static string XmlSerialize<T>(T entity) where T : class
{
// removes version
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
XmlSerializer xsSubmit = new XmlSerializer(typeof(T));
using (StringWriter sw = new StringWriter())
using (XmlWriter writer = XmlWriter.Create(sw, settings))
{
// removes namespace
var xmlns = new XmlSerializerNamespaces();
xmlns.Add(string.Empty, string.Empty);
xsSubmit.Serialize(writer, entity, xmlns);
return sw.ToString(); // Your XML
}
}
- 1. Làm thế nào để tuần tự hóa một đối tượng JavaScript chung thành XML
- 2. tuần tự hóa các đối tượng python thành XML
- 3. Đối tượng tuần tự hóa thành XmlDocument
- 4. Việc tuần tự hóa đối tượng thành xml và chuỗi mà không có \ r \ n ký tự đặc biệt
- 5. Làm cách nào để tuần tự hóa một đối tượng thành một XDocument?
- 6. Làm thế nào để thay đổi một đối tượng được tuần tự hóa?
- 7. Làm thế nào để tuần tự hóa các đối tượng db.Model thành json?
- 8. Cách tốt nhất để tuần tự hóa các đối tượng JavaScript thành XML là gì?
- 9. Làm thế nào để thiết lập xmlns khi serializing đối tượng trong C#
- 10. Làm thế nào để tuần tự hóa một gói?
- 11. Làm thế nào để tuần tự hóa một mảng đối tượng jQuery cho JSON Post?
- 12. Làm cách nào để ngăn jQuery chèn các thuộc tính 'xmlns' vào một đối tượng XML?
- 13. Làm cách nào để tuần tự hóa đối tượng System.Windows.Media.Color thành chuỗi sRGB?
- 14. Làm thế nào để tuần tự hóa một JObject mà không có định dạng?
- 15. Làm thế nào để tuần tự hóa/deserialize một C# WCF DataContract đến/từ XML
- 16. Làm thế nào để tuần tự hóa thành Json một cấu trúc đối tượng với tham chiếu vòng tròn?
- 17. Bỏ qua hướng dẫn xử lý XML khi tuần tự hóa một đối tượng
- 18. Làm thế nào để thực hiện tuần tự hóa Java mà không cần phản ánh?
- 19. Việc tuần tự hóa các đối tượng có nguồn gốc mà không có xsi: loại
- 20. Làm thế nào để tuần tự hóa/deserialize các lớp đơn giản thành XML và quay lại
- 21. Làm thế nào để tuần tự hóa/deserialize một hashmap?
- 22. XMlSerialization không tuần tự hóa một datetime
- 23. Biểu đồ đối tượng là gì và làm cách nào để tuần tự hóa một số
- 24. Làm cách nào để tuần tự hóa một đối tượng đơn giản trong sdk iPhone?
- 25. BOOST_SERIALIZATION_NVP làm gì khi tuần tự hóa đối tượng?
- 26. StackOverflowError khi tuần tự hóa một đối tượng trong Java
- 27. Làm cách nào để tuần tự hóa một đối tượng có giao diện là thuộc tính?
- 28. Tính không biến đổi và tuần tự hóa XML
- 29. Danh sách tuần tự hóa thành JSON
- 30. Làm thế nào để tuần tự hóa một DataTable thành một chuỗi?
Tôi đã thử tính năng này trong VB, thuộc tính xsi và xsd biến mất nhưng các thuộc tính như xmlns: q12 =, d3p1: type và xmlns: d3p1 xuất hiện. – MiddleKay
Tôi đã thử phiên bản C# và đã xóa xsi và xsd nhưng thêm tiền tố q1: vào tất cả các tên thẻ XML mà tôi không muốn.Dường như ví dụ C# là không đầy đủ, tham chiếu myXmlTextWriter mà tôi cho rằng cần phải được khởi tạo giống như ví dụ VB. – redtetrahedron
@redtetrahedron Bạn đã tìm ra cách để loại bỏ 'q1' crap? – crush