2016-07-05 3 views
2

У меня есть массив классов, который я собираюсь передать в 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 и ничего не получили.

+0

вам нужно UTF-16 ли? Можете ли вы использовать utf-8? – jdweng

+0

Можете ли вы попробовать распечатать xml или вставить xml во временную таблицу в процедуре? Любопытно, что строка xml содержит в строке 1 char 37. Похож на последний символ в первой строке. Может быть, неудачный разрыв строки. –

+0

Не могли бы вы дать нам определение класса, которое вы передаете ToXML? Кроме того, как вы преобразовываете XmlDocument в строку перед передачей ее в хранимую процедуру, используете ли вы XmlDocument.Save? –

ответ

Смежные вопросы