C# SQLServer-使用For XML创建格式良好的XML
我试图从SQLServer中的表数据生成一个大的.XML文件。但是当我试图在.NET端解析它时,我得到了格式良好的错误 SQL代码:-C# SQLServer-使用For XML创建格式良好的XML,c#,sql-server,xml,file,sql-server-2016,C#,Sql Server,Xml,File,Sql Server 2016,我试图从SQLServer中的表数据生成一个大的.XML文件。但是当我试图在.NET端解析它时,我得到了格式良好的错误 SQL代码:- Select TOP 300000 PID as ID, Replace(LTRIM(RTRIM(Substring(EFSNameLine1,10,30))),'&','') as NameLine1, LTRIM(RTRIM(EFSNameLin
Select TOP 300000
PID as ID,
Replace(LTRIM(RTRIM(Substring(EFSNameLine1,10,30))),'&','') as NameLine1,
LTRIM(RTRIM(EFSNameLine2)) as NameLine2,
LTRIM(RTRIM(EFSCity)) as City,
LTRIM(RTRIM(EFSState)) as [State],
LTRIM(RTRIM(EFSZip)) as ZipCode,
DateUpdated as DateUpdated
From dbo.partner as Contact with(nolock)
ORDER by PID DESC
FOR XML Auto, Root('CustomerData')
然后,我将SQLServerManagementStudio结果窗口的输出保存到外部XML文件中。文件大小很高,大约60兆
但是,当我试图将XML数据解析到数据集中时,会出现格式不正确的XML错误
var xmlfilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "customer-sample-data.xml");
Console.WriteLine("XML File path >>>> " + xmlfilePath);
DataSet objDataSet = new DataSet();
objDataSet.ReadXml(xmlfilePath);
if (objDataSet != null)
{
Console.WriteLine("Data obj is ready !");
}
请建议如何从SQLServerManagementStudio工具生成大型数据XML文件。我的要求是准备样本XML数据供其他应用程序使用,以便进行一些测试。为什么要从SQL server而不是从代码生成它。您需要做的是从SQLServer返回行集合,然后在代码中生成xml。下面是用于从行集合生成xml的示例代码
public static class SerializationHelper
{
public static bool Serialize<T>(T value, out string serializedXml) where T : class
{
serializedXml = string.Empty;
if (value == null)
return false;
try
{
using (var writer = new StringWriter())
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
xmlSerializer.Serialize(writer, value);
serializedXml = writer.ToString();
}
return true;
}
catch (SerializationException)
{
return false;
}
}
public static string ToXml<T>(T value) where T : class
{
string result;
Serialize(value, out result);
return result;
}
public static T FromXml<T>(string xml) where T : class
{
var xmlSerializer = new XmlSerializer(typeof(T));
var reader = new StringReader(xml);
var obj = xmlSerializer.Deserialize(reader);
return obj as T;
}
}
这就是我的类序列化的样子
[XmlRoot(ElementName = "myitem")]
public class Myitem
{
[XmlElement(ElementName = "Item1")]
public string Item1 { get; set; }
[XmlElement(ElementName = "Item2")]
public string Item2 { get; set; }
[XmlElement(ElementName = "Item3")]
public string Item3 { get; set; }
}
[XmlRoot(ElementName = "root")]
public class Root
{
[XmlElement(ElementName = "myitem")]
public List<Myitem> Myitem { get; set; }
[XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")]
public string Xsi { get; set; }
}
[XmlRoot(ElementName=“myitem”)]
公共类Myitem
{
[xmlement(ElementName=“Item1”)]
公共字符串Item1{get;set;}
[xmlement(ElementName=“Item2”)]
公共字符串Item2{get;set;}
[xmlement(ElementName=“Item3”)]
公共字符串Item3{get;set;}
}
[XmlRoot(ElementName=“root”)]
公共类根
{
[XmlElement(ElementName=“myitem”)]
公共列表Myitem{get;set;}
[XmlAttribute(AttributeName=“xsi”,命名空间=”http://www.w3.org/2000/xmlns/")]
公共字符串Xsi{get;set;}
}
然后我可以像下面一样调用上面相同的帮助器方法来生成集合
var result = await db.GetData();//string xml
var response = SerializationHelper.FromXml<Root>(result);
var result=await db.GetData()//字符串xml
var response=SerializationHelper.FromXml(结果);
您最初发布的代码在错误的位置有一个逗号。。。我想你已经修改了这个,为了简洁(一个好主意)。此语句根本不起作用(语法错误)
我把你的问题编辑成
Select TOP 300000
PID as ID,
Replace(LTRIM(RTRIM(Substring(EFSNameLine1,10,30))),'&','') as NameLine1,
LTRIM(RTRIM(EFSNameLine2)) as NameLine2,
--more columns here
From dbo.partner as Contact with(nolock)
ORDER by PID DESC
FOR XML Auto, Root('CustomerData')
首先:没有必要考虑&
字符(如果没有其他理由替换此字符)SELECT 'This <> is & forbidden!' FOR XML PATH('row'),ROOT('test')
导致
<test>
<_x0040_tbl Strange_x0020_Name="1" Other_x0027_Strange_x0022_Name="1" _x0020_="1" Silly_x003C__x0026__x003E_="1" With_x0020_a_x0020__x000D__x000A__x0009_Line_x0020_Break="1" />
</test>
EXCPITION消息指向第6行,位置1。位置1可能指向错误位置的新行
。“ode”
可能连接到ZipCode
尝试在编辑器中打开XML并检查错误
也许您正在使用一个变量,使整个内容在生成和写出之间的某个地方变小?这可能会在XML结束之前剪切它
总之,我建议对XML PATH()使用
在所有情况下,使用AUTO
您永远不会知道幕后到底发生了什么。PATH
允许您更好地控制输出和格式。我无法从代码生成XML数据,因为它将被另一个团队用于某些测试。在这种情况下,为什么他们不能在最后使用相同的XML解析。因为另一个团队无法访问数据库。您是否查看了“第6行位置1”" ? 这条消息听起来像是xml中出现了意外的换行符或类似的内容,但我正在使用SQL查询生成xml,它应该是格式良好的。我想知道,在从管理研究主题创建格式良好的xml时,我是否遗漏了一些东西,可能对您的代码没有问题;可能导致丢失和重复记录等。回到话题上来;您能提供一个XML示例吗?可能是包含第6行的一个?您是否尝试过将查询结果使用结果归档
,而不是结果归档
,然后保存到文件?@digital.亚伦我认为这可能是我问题的解决方案。我会试试这个选择。
<test>
<row>This <> is & forbidden!</row>
</test>
--Name with blank,
--Name with quotes,
--blank only,
--Name with forbidden chararacters,
--Name inlcudes a line break!
DECLARE @tbl TABLE([Strange Name] INT
,[Other'Strange"Name] INT
,[ ] INT
,[Silly<&>] INT
,[With a
Line Break] INT);
INSERT INTO @tbl VALUES(1,1,1,1,1);
SELECT * FROM @tbl; --Working "normally"
SELECT * FROM @tbl FOR XML AUTO, ROOT('test');
<test>
<_x0040_tbl Strange_x0020_Name="1" Other_x0027_Strange_x0022_Name="1" _x0020_="1" Silly_x003C__x0026__x003E_="1" With_x0020_a_x0020__x000D__x000A__x0009_Line_x0020_Break="1" />
</test>