Tôi có một chút vấn đề duy nhất. Tôi đang đăng ký một dll như một hội đồng bên trong của một cơ sở dữ liệu SQL Server có một biến SQLXml, cùng với hai chuỗi, và tuần tự hóa dữ liệu thành định dạng JSON.Deserializing XML thành JSON mà không sử dụng hàm XmlDocument.Loadxml()
Để tham khảo, đây là lời gọi phương thức:
[SqlProcedure]
public static void Receipt(SqlString initiatorPassword,
SqlString initiatorId,
SqlXml XMLOut,
out SqlString strMessge)
Tôi sẽ sử dụng Newtonsoft.Json hoặc Jayrock cho ứng dụng này nếu điều này là bất kỳ loại khác của ứng dụng. Bình thường, tôi sẽ làm theo câu trả lời cho here và làm điều gì đó tương tự như:
XmlReader r = (XmlReader)XmlOut.CreateReader();
XmlDocument doc = new XmlDocument();
doc.load(r);
Tuy nhiên, kể từ khi tôi đang sử dụng SQLCLR, có những quy tắc nhất định của con đường. Một trong số đó là .Load()
và không thể sử dụng bất kỳ phương pháp kế thừa nào khác. Tôi nghĩ khuôn khổ .Net cho biết tốt nhất:
System.InvalidOperationException: Không thể tải cụm nối tiếp được tạo động. Trong một số môi trường lưu trữ chức năng tải lắp ráp bị hạn chế, cân nhắc sử dụng bộ nối tiếp được tạo trước. Vui lòng xem ngoại lệ bên trong để biết thêm thông tin. ---> System.IO.FileLoadException:
LoadFrom(), LoadFile(), Load (byte []) và LoadModule() đã bị vô hiệu hóa bởi máy chủ.
Tôi không thông thạo trong SQLCLR bằng bất kỳ phương tiện, nhưng nếu tôi hiểu biết một cách chính xác this blog, điều này được gây ra bởi các quy tắc SQLCLR của không cho phép Load() và kế thừa phương pháp mà không bị ký hợp đồng với và có một tên mạnh. DLL của tôi và DLL của bên thứ ba mà tôi đang sử dụng không có tên mạnh và tôi cũng có thể tự xây dựng lại và ký tên cho họ. Vì vậy, điều này khiến tôi bị mắc kẹt với cố gắng hoàn thành nhiệm vụ này mà không cần sử dụng tải (Trừ khi ai đó biết cách khác có thể thực hiện được)
Giải pháp duy nhất tôi có thể đưa ra là một vòng lặp rất xấu nhưng không hoạt động đúng cách , Tôi đã nhận được một "Jayrock.Json.JsonException: Một giá trị thành viên JSON bên trong một đối tượng JSON phải được đặt trước bởi tên thành viên của nó" ngoại lệ. Đây là vòng lặp trong khi tôi đã viết (không mã tốt nhất của tôi, tôi biết):
int lastdepth = -1;
Boolean objend = true;
Boolean wt = false;
//Write Member/Object statements for the header omitted
JsonWriter w = new JsonTextWriter()
while (m.Read())
{
if ((lastdepth == -1) && (m.IsStartElement()))
{//Checking for root element
lastdepth = 0;
}
if ((m.IsStartElement()) && (lastdepth != -1))
{//Checking for Start element (<html>)
w.WriteMember(m.Name);
if (objend)
{ //Check if element is new Parent Node, if so, write start object
w.WriteStartObject();
objend = false;
}
}
if (m.NodeType == XmlNodeType.Text)
{ //Writes text here. NOTE: m.Depth > lastdepth here!!!!!!!
w.WriteString(m.Value);
wt = true;
}
if (m.NodeType == XmlNodeType.Whitespace) //If whitespace, keep on truckin
{ m.Skip(); }
if ((m.NodeType == XmlNodeType.EndElement) && (wt == false) && (lastdepth > m.Depth))
{//End element that ends a series of "Child" nodes
w.WriteEndObject();
objend = true;
}
if ((m.NodeType == XmlNodeType.EndElement) && (wt == true))//Standard end of an el
{ wt = false; }
lastdepth = m.Depth;
}
w.WriteEndObject();
jout = w.ToString();
}
Câu hỏi của tôi là, vì tôi không thể sử dụng .load()
và vòng lặp trong khi tôi là một mớ hỗn độn để gỡ lỗi, những gì sẽ là tốt nhất cách tiếp cận ở đây? Cách tiếp cận khác thường được thảo luận là deserialization vào một đối tượng với các biến phù hợp nhưng tôi có một XML khá lớn sắp ra khỏi SQL Server. Vòng lặp của tôi là một nỗ lực trong lập trình động vì có ~ 200 trường đang được kéo để tạo XML này.
Lưu ý: Tôi đang sử dụng Jayrock và làm việc trong .Net Framework 2.0. Tôi không thể thay đổi phiên bản khung tại thời điểm này.
AFAIK 'XmlDocument.LoadXml()' không cần dẫn đầu các cụm động. Bạn có chắc là bạn không cố gắng sử dụng xê-ri hóa XML thay thế không? Bạn có thể đăng theo dõi ngăn xếp của ngoại lệ không? – svick