Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLServer-使用For XML创建格式良好的XML_C#_Sql Server_Xml_File_Sql Server 2016 - Fatal编程技术网

C# SQLServer-使用For XML创建格式良好的XML

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

我试图从SQLServer中的表数据生成一个大的.XML文件。但是当我试图在.NET端解析它时,我得到了格式良好的错误

SQL代码:-

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 &lt;&gt; is &amp; 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>