У меня есть массив классов, который я собираюсь передать в XML, чтобы отправить его позже в хранимую процедуру SQL Server. Проблема в том, что когда я выполняю StringWriter, он добавляет некоторые символы scape (= \), которые появляются в конечном XML.StringWriter.ToString() разбивается на xml C#
Мой код выглядит следующим образом:
public XmlDocument ToXML(object obj_to_xml)
{
string str_XML;
XmlDocument xml = new XmlDocument();
var stringwriter = new System.IO.StringWriter();
var serializer = new XmlSerializer(obj_to_xml.GetType());
serializer.Serialize(stringwriter, obj_to_xml);**
//at this point the format is correct, for example stringwriter contains:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfRegistroPrestamo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RegistroPrestamo>
<Id>1</Id>
<Cedula>8-834-789</Cedula>
<Nombre>Amarillos</Nombre>
<Apellido>Perez</Apellido>
</RegistroPrestamo>
<RegistroPrestamo>
<Id>0</Id>
<Cedula />
<Nombre />
<Apellido />
</RegistroPrestamo>
</ArrayOfRegistroPrestamo>
//the problem comes with this line
xml.LoadXml(stringwriter.ToString());
//final XML looks like this:
<?xml version=\"1.0\" encoding=\"utf-16\"?>
<ArrayOfRegistroPrestamo xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
<RegistroPrestamo>
<Id>1</Id>
<Cedula>8-834-789</Cedula>
<Nombre>Amarillos</Nombre>
<Apellido>Perez</Apellido>
</RegistroPrestamo>
<RegistroPrestamo>
<Id>0</Id>
<Cedula />
<Nombre />
<Apellido />
</RegistroPrestamo>
</ArrayOfRegistroPrestamo>
return xml;
}
Когда SQL Server пытается обработать XML-код:
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "P_Save_Procedure";
cmd.Parameters.Add("@Registros", SqlDbType.Xml).Value = xml;
хранимых процедур Текст
Create procedure [dbo].[P_Save_Procedure]
(@Registros as xml)
as
begin
select distinct 'Id' = x.v.value('Id[1]', 'Int')
from @Registros.nodes('/ArrayOfRegistroPrestamo/RegistroPrestamo') x(v)
end
Я получил ошибку:
Me нс. 9413, уровень 16, состояние 1, строка 4 Анализ XML: строка 1, символ 37; Она ожидает, что строковый литерал
Если я вызываю SP вручную с правильной версии XML:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfRegistroPrestamo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RegistroPrestamo>
<Id>1</Id>
<Cedula>8-834-789</Cedula>
<Nombre>Amarillos</Nombre>
<Apellido>Perez</Apellido>
</RegistroPrestamo>
<RegistroPrestamo>
<Id>0</Id>
<Cedula />
<Nombre />
<Apellido />
</RegistroPrestamo>
</ArrayOfRegistroPrestamo>
В результате ожидаемого.
Уже провели 2 дня, чтобы найти способ получить правильный синтакс для XML и ничего не получили.
вам нужно UTF-16 ли? Можете ли вы использовать utf-8? – jdweng
Можете ли вы попробовать распечатать xml или вставить xml во временную таблицу в процедуре? Любопытно, что строка xml содержит в строке 1 char 37. Похож на последний символ в первой строке. Может быть, неудачный разрыв строки. –
Не могли бы вы дать нам определение класса, которое вы передаете ToXML? Кроме того, как вы преобразовываете XmlDocument в строку перед передачей ее в хранимую процедуру, используете ли вы XmlDocument.Save? –