none
从Web Service中返回的XML字符串,客户端总是提示"XML 文档(36, -1883)中有错误"? RRS feed

  • 问题

  • 标题:从Web Service中返回的XML字符串,客户端总是提示"XML 文档(36, -1883)中有错误"?

    .Net实现的Web Service,返回一个XML字符串给客户端,方法签名如下:

    public string GetProxys( int mode )


    返回的XML字符串如下:
    <Proxys>
      <xs:schema id="Proxys" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xs:element name="Proxys" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
          <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="Proxy">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="IP" type="xs:string" minOccurs="0" />
                    <xs:element name="Port" type="xs:int" minOccurs="0" />
                    <xs:element name="Type" type="xs:int" minOccurs="0" />
                    <xs:element name="Status" type="xs:int" minOccurs="0" />
                    <xs:element name="ResponseTime" type="xs:int" minOccurs="0" />
                    <xs:element name="ValidateTime" type="xs:int" minOccurs="0" />
                    <xs:element name="ConnectTime" type="xs:int" minOccurs="0" />
                    <xs:element name="PostTime" type="xs:dateTime" minOccurs="0" />
                    <xs:element name="LastValidateTime" type="xs:dateTime" minOccurs="0" />
                    <xs:element name="Remarks" type="xs:string" minOccurs="0" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:complexType>
        </xs:element>
      </xs:schema>
      <Proxy>
        <IP>10.0.0.2</IP>
        <Port>3128</Port>
        <Type>-1</Type>
        <Status>11</Status>
        <ResponseTime>0</ResponseTime>
        <ValidateTime>0</ValidateTime>
        <ConnectTime>0</ConnectTime>
        <PostTime>2010-07-04T11:51:56.89+08:00</PostTime>
      </Proxy>
    </Proxys>

     

    客户端使用 WSDL.exe 生成了这个Web Service的代理类,然后使用这个代理类的Web方法获取XML字符串:

    string proxyXML = null;
    WRSWebServices wrsWebServices = new WRSWebServices();
    proxyXML = wrsWebServices.GetProxys( 1 );


    但是在执行到【proxyXML = wrsWebServices.GetProxys( 1 );】时总是要抛出一个 InvalidOperationException 异常,异常信息为【XML 文档(36, -1883)中有错误】,
    但是,如果我返回的XML字符串不包含架构信息,那客户端的代码就能正常运行,
    这是为什么呢?

    2010年7月4日 4:38

答案

  • string connStr = "Data Source=localhost;Initial Catalog=BusinessServiceRepository;Integrated Security=True";
          SqlConnection conn = new SqlConnection(connStr);
          try
          {
            conn.Open();
            
            SqlDataAdapter da = new SqlDataAdapter("select * from HostedServices", conn);
    
            DataSet ds = new DataSet();
            da.Fill(ds);
    
            using (MemoryStream ms = new MemoryStream())
            {
              ds.WriteXml(ms, XmlWriteMode.WriteSchema);
    
              // MemoryStream.GetBuffer() 会返回整个Buffer,包含无效的 '\0'
              // 所以,使用 Read 方式只读取有效的字符。
              byte[] buff = new byte[ms.Length];
              ms.Seek(0, SeekOrigin.Begin);
              ms.Read(buff, 0, buff.Length);
              
              // 这个 xml 字符串可以直接返回给客户端。
              string xmlResults =Encoding.GetEncoding("GB2312").GetString(buff);
    
              // 作为测试生成的 xml 是否正确,可以写入本地文件,然后通过 IE 查看。
              using (FileStream fs = File.Open(@"D:\soap.xml", FileMode.Create))
              {
                fs.Write(buff, 0, buff.Length);
                fs.Flush();
              }
            }
          }
          finally
          {
            conn.Close();
          }
    2010年7月8日 5:29

全部回复

  • 你好,

    InvalidOperationException 报无效的操作。

    你看看proxyXML = wrsWebServices.GetProxys( 1 );这句返回来的数据类型是否一致。

    另外如果类型一致,那说明客户端调用是正确的。那你得再看看服务器端是否有问题了。

     


    Microsoft Online Community Support
    2010年7月6日 1:50
  • 你好,

    InvalidOperationException 报无效的操作。

    你看看proxyXML = wrsWebServices.GetProxys( 1 );这句返回来的数据类型是否一致。

    另外如果类型一致,那说明客户端调用是正确的。那你得再看看服务器端是否有问题了。

     


    Microsoft Online Community Support


    看不到 wrsWebServices.GetProxy(1); 的返回值类型,因为一执行到这句就抛出异常,

    并在这一句的时候无法 F11 跟进去。

    2010年7月6日 9:43
  • 你好,

    如果你确定你的客户端调用是正确的,可能是服务器端的问题了。

    你能否调试服务器端的方法GetProxys?


    Microsoft Online Community Support
    2010年7月6日 9:54
  • 你好,

    如果你确定你的客户端调用是正确的,可能是服务器端的问题了。

    你能否调试服务器端的方法GetProxys?


    Microsoft Online Community Support


    服务器端的 GetProxys() 我进行了单步跟踪,

    没有问题,一直执行到最后一句 return proxyXML; 我还用调试查看了 proxyXML 变量的值,是对的。

    有一个关键点是:

    如果我返回的XML字符串不包含架构信息,那客户端的代码就能正常运行,
    如果返回的XML字符串包含架构信息,那客户端代码就抛出异常。

    2010年7月6日 10:06
  • 把你的xml字符串用HttpUtility.UrlEncode后再返回。
    2010年7月7日 1:12
  • 你好,

    问题很奇怪。

    你的webservice端是怎么返回xml字符串的。能否提供GetProxys方法的代码。


    Microsoft Online Community Support
    2010年7月7日 1:13
  • 你好,

    问题很奇怪。

    你的webservice端是怎么返回xml字符串的。能否提供GetProxys方法的代码。


    Microsoft Online Community Support


    一点都不奇怪,因为他使用了DataSet,而又想让非.net平台能读取数据.

    如果服务定义为 DataSet GetProxys(int mode),.net framework可以自动序列化成他提供的那个xml字符串(当然还会在字符串外包含完整的soap标记),其它平台可以定义

    string GetProxys( int mode ) 这样的契约并从soap body中获取该xml字符串,只是无法还原成DataSet,这就在形式上造成了客户端和服务端在契约表现上的不一致性。

    所以他提供了一个解决方案,就是服务也定义为 string GetProxys( int mode ),然后手动把DataSet序列化成xml字符串,以保证客户端和服务端契约一致性。

    实际上,很多java的程序员写web service时都这么做,接口总是返回一个xml字符串。

    2010年7月7日 3:44
  • 你好,

    问题很奇怪。

    你的webservice端是怎么返回xml字符串的。能否提供GetProxys方法的代码。


    Microsoft Online Community Support


    一点都不奇怪,因为他使用了DataSet,而又想让非.net平台能读取数据.

    如果服务定义为 DataSet GetProxys(int mode),.net framework可以自动序列化成他提供的那个xml字符串(当然还会在字符串外包含完整的soap标记),其它平台可以定义

    string GetProxys( int mode ) 这样的契约并从soap body中获取该xml字符串,只是无法还原成DataSet,这就在形式上造成了客户端和服务端在契约表现上的不一致性。

    所以他提供了一个解决方案,就是服务也定义为 string GetProxys( int mode ),然后手动把DataSet序列化成xml字符串,以保证客户端和服务端契约一致性。

    实际上,很多java的程序员写web service时都这么做,接口总是返回一个xml字符串。


    非常非常非常正确!

    我就是希望我的Web Service能被所有语言调用,所以不能返回 .Net 的 DataSet,而只能返回一个能被所有语言识别的 XML 字符串。我的设计思想确实是这样的。

    2010年7月7日 4:08
  • Web Service 方法 GetProxys(int) 的源代码如下:

      public string GetProxys( int mode )
      {
       DataSet ds = Data.DatabaseProvider.GetInstance().GetProxys( mode );
       string resultXML = string.Empty;
    
       if( ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0 )
       {
        ds.DataSetName = "Proxys";
        ds.Tables[0].TableName = "Proxy";
    
        MemoryStream ms = new MemoryStream();
        ds.WriteXml( ms, XmlWriteMode.WriteSchema );
        resultXML = HttpUtility.HtmlEncode( Encoding.GetEncoding( 936 ).GetString( ms.GetBuffer() ) );
    
    
        //
        // 如果返回带架构信息的XML,但在客户端调用此 WebService 时会报错:"XML 文档(36, -1883)中有错误"
        // 所以,在此返回不带架构信息的XML
        //
        // resultXML = ds.GetXml();
       }
    
       return resultXML;
      }

     

    客户端的调用代码如下(WRSWebServices类型是通过WSDL.exe自动生成):

      private void btn_GetProxys_Click( object sender, EventArgs e )
      {
       string proxyXML = null;
    
       WRSWebServices wrsWebServices = new WRSWebServices();
       try
       {
        proxyXML = HttpUtility.HtmlDecode( wrsWebServices.GetProxys( 1 ) );
        // proxyXML = wrsWebServices.GetProxys( 1 );
        this.richTextBox1.Text = null;
        this.richTextBox1.Text = proxyXML;
       }
       catch( InvalidOperationException ioe )
       {
        System.Diagnostics.Debug.Print( ioe.Message );
        MessageBox.Show( ioe.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error );
       }
      }

     

    只要执行到这里 WRSWebServices wrsWebServices = new WRSWebServices(); 就抛出个 InvalidOperationException 异常。

    但是如果 Web Service 不返回带架构信息的 XML 字符串,客户端就正常运行!

    2010年7月7日 4:23
  • 你好, 参考下面的文档 http://msdn.microsoft.com/en-us/library/ms135424.aspx

     Note: An InvalidOperationException will be thrown if a column type in the DataRow being read from or written to implements IDynamicMetaObjectProvider and does not implement IXmlSerializable.


    Microsoft Online Community Support

    2010年7月7日 4:31
  • 你先把服务方法改下:

    public string GetProxys(int mode)
            {
                XmlDocument doc = new XmlDocument();           
                doc.Load(@"D:\soap.xml");
                return doc.InnerXml;
            }

    把你的DataSet先写入一个文件 soap.xml,然后你的服务方法直接从这个文件读数据返回给客户端。

    如果也出现这个错误,我估计是字符编码不对,或者长度限制。

    如果没有错误,我估计你下面的代码有点小错误:

    MemoryStream ms = new MemoryStream();
    ds.WriteXml( ms, XmlWriteMode.WriteSchema );

    // 在取字符串之前,先刷新

    ms.Flush();

    resultXML = ds.GetXml();

    2010年7月7日 6:09
  • 你好 对于出现XML 文档(36, -1883)中有错误 这种错误,一般均是由于XML格式不正确,比如需要转义的地方没有转义,编码不一致等等情况造成的

    所以请确保一致性以及返回的XML最好添加XML头注明编码encoding和版本等


    I see you~,.NET交流群71840452 微软中文论坛同城社区成都QQ群:74268428http://hi.baidu.com/1987raymondMy Blog~~~
    2010年7月7日 8:16
    版主
  • To KeFang Chen:

    Note: An InvalidOperationException will be thrown if a column type in the DataRow being read from or written to implements IDynamicMetaObjectProvider and does not implement IXmlSerializable.
    如果 DataRow 的列类型被读出或写入到实现了 IDynamicMetaObjectProvider 但没有实现 IXmlSerializable(的对象时),会抛出一个 An InvalidOperationException 异常。

    英文这个意思吗?我的英文不好,没太看明白,请指点。

     

    To Galactica:

    Flush() 方法是把数据从缓存写入物理存储,比如磁盘。但对 MemoryStream 对象调用这个方法的意思是把数据从内存中 Flush 到内存中?我不太明白你的意思,请指点。

     

    To Raymond Tang:

    1、关于编码方式:我是从 DataSet.WriteXml() 方法生成的XML字符串,这个函数根本就不接受 Encoding 类型的参数,所以我都不知道我的字符串到底是什么类型。resultXML = HttpUtility.HtmlEncode( Encoding.GetEncoding( 936 ).GetString( ms.GetBuffer() ) ); 我用GB2312进行编码是猜的,但返回的字符串在调试器中看起来正确,所以我就以为编码方式确实是GB2312了。

    2、生成的XML字符串没有XML声明,也是因为所有XML字符串都是 DataSet.WriteXml() 方法生成的原因,那我确实需要手动给它添加一下XML声明?

    2010年7月8日 4:16
  • 按照 Galactica 和 Raymond Tang 的提议,我先加了一个XML声明,然后再写入到磁盘文件,然后再加载XML文件并回传给客户端。修改后的服务器端代码片断如下:

            MemoryStream ms = new MemoryStream();
            ds.WriteXml( ms, XmlWriteMode.WriteSchema );
            //resultXML = HttpUtility.HtmlEncode( Encoding.GetEncoding( 936 ).GetString( ms.GetBuffer() ) );
            resultXML =Encoding.GetEncoding( 936 ).GetString( ms.GetBuffer() );
            resultXML = resultXML.Insert( 0, @"<?xml version='1.0' encoding='GB2312' standalone='yes'?>" + Environment.NewLine );
    
            try
            {
              string fileName = @"d:\temp\proxys.xml";
              XmlWriterSettings settings = new XmlWriterSettings();
              settings.Indent = true;
              settings.IndentChars = ( "  " );
              using( XmlWriter writer = XmlWriter.Create( fileName, settings ) )
              {
                // Write XML data.
                writer.WriteString( resultXML ); // 就在这里抛出 InvalidOperationException 异常
                writer.Flush();
              }
              XmlDocument doc = new XmlDocument();
              doc.Load( fileName );
              return doc.InnerXml;
            }
            catch(InvalidOperationException ioe)
            {
              System.Diagnostics.Debug.Print( ioe.Message );
              return string.Empty;
            }

    添加了声明的XML字符串如下:

    <?xml version='1.0' encoding='GB2312' standalone='yes'?>
    <Proxys>
     <xs:schema id="Proxys" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
      <xs:element name="Proxys" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
       <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
         <xs:element name="Proxy">
          <xs:complexType>
           <xs:sequence>
            <xs:element name="IP" type="xs:string" minOccurs="0" />
            <xs:element name="Port" type="xs:int" minOccurs="0" />
            <xs:element name="Type" type="xs:int" minOccurs="0" />
            <xs:element name="Status" type="xs:int" minOccurs="0" />
            <xs:element name="ResponseTime" type="xs:int" minOccurs="0" />
            <xs:element name="ValidateTime" type="xs:int" minOccurs="0" />
            <xs:element name="ConnectTime" type="xs:int" minOccurs="0" />
            <xs:element name="PostTime" type="xs:dateTime" minOccurs="0" />
            <xs:element name="LastValidateTime" type="xs:dateTime" minOccurs="0" />
            <xs:element name="Remarks" type="xs:string" minOccurs="0" />
           </xs:sequence>
          </xs:complexType>
         </xs:element>
        </xs:choice>
       </xs:complexType>
      </xs:element>
     </xs:schema>
     <Proxy>
      <IP>10.0.0.2</IP>
      <Port>3128</Port>
      <Type>-1</Type>
      <Status>11</Status>
      <ResponseTime>0</ResponseTime>
      <ValidateTime>0</ValidateTime>
      <ConnectTime>0</ConnectTime>
      <PostTime>2010-07-04T11:51:56.89+08:00</PostTime>
     </Proxy>
    </Proxys>

    每当执行到 【writer.WriteString( resultXML );】时,就抛出一个 InvalidOperationException 异常,异常消息为:【处于状态 Start 的标记 Text 将导致无效的 XML 文档。 如果要编写 XML 片断,请确保 ConformanceLevel 设置已设置为 ConformanceLevel.Fragment 或 ConformanceLevel.Auto。 】

    难道是 DataSet.WriteXml() 方法生成的XML字符串有错???

    2010年7月8日 4:51
  • string connStr = "Data Source=localhost;Initial Catalog=BusinessServiceRepository;Integrated Security=True";
          SqlConnection conn = new SqlConnection(connStr);
          try
          {
            conn.Open();
            
            SqlDataAdapter da = new SqlDataAdapter("select * from HostedServices", conn);
    
            DataSet ds = new DataSet();
            da.Fill(ds);
    
            using (MemoryStream ms = new MemoryStream())
            {
              ds.WriteXml(ms, XmlWriteMode.WriteSchema);
    
              // MemoryStream.GetBuffer() 会返回整个Buffer,包含无效的 '\0'
              // 所以,使用 Read 方式只读取有效的字符。
              byte[] buff = new byte[ms.Length];
              ms.Seek(0, SeekOrigin.Begin);
              ms.Read(buff, 0, buff.Length);
              
              // 这个 xml 字符串可以直接返回给客户端。
              string xmlResults =Encoding.GetEncoding("GB2312").GetString(buff);
    
              // 作为测试生成的 xml 是否正确,可以写入本地文件,然后通过 IE 查看。
              using (FileStream fs = File.Open(@"D:\soap.xml", FileMode.Create))
              {
                fs.Write(buff, 0, buff.Length);
                fs.Flush();
              }
            }
          }
          finally
          {
            conn.Close();
          }
    2010年7月8日 5:29
  • 按照 Galactica 和 Raymond Tang 的提议,我先加了一个XML声明,然后再写入到磁盘文件,然后再加载XML文件并回传给客户端。修改后的服务器端代码片断如下:

        MemoryStream ms = new MemoryStream();
    
        ds.WriteXml( ms, XmlWriteMode.WriteSchema );
    
        //resultXML = HttpUtility.HtmlEncode( Encoding.GetEncoding( 936 ).GetString( ms.GetBuffer() ) );
    
        resultXML =Encoding.GetEncoding( 936 ).GetString( ms.GetBuffer() );
    
        resultXML = resultXML.Insert( 0, @"<?xml version='1.0' encoding='GB2312' standalone='yes'?>" + Environment.NewLine );
    
    
    
        try
    
        {
    
         string fileName = @"d:\temp\proxys.xml";
    
         XmlWriterSettings settings = new XmlWriterSettings();
    
         settings.Indent = true;
    
         settings.IndentChars = ( " " );
    
         using( XmlWriter writer = XmlWriter.Create( fileName, settings ) )
    
         {
    
          // Write XML data.
    
          writer.WriteString( resultXML ); // 就在这里抛出 InvalidOperationException 异常
    
          writer.Flush();
    
         }
    
         XmlDocument doc = new XmlDocument();
    
         doc.Load( fileName );
    
         return doc.InnerXml;
    
        }
    
        catch(InvalidOperationException ioe)
    
        {
    
         System.Diagnostics.Debug.Print( ioe.Message );
    
         return string.Empty;
    
        }
    
    

    添加了声明的XML字符串如下:

    <?xml version='1.0' encoding='GB2312' standalone='yes'?>
    
    <Proxys>
    
     <xs:schema id="Proxys" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    
     <xs:element name="Proxys" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    
      <xs:complexType>
    
      <xs:choice minOccurs="0" maxOccurs="unbounded">
    
       <xs:element name="Proxy">
    
       <xs:complexType>
    
        <xs:sequence>
    
        <xs:element name="IP" type="xs:string" minOccurs="0" />
    
        <xs:element name="Port" type="xs:int" minOccurs="0" />
    
        <xs:element name="Type" type="xs:int" minOccurs="0" />
    
        <xs:element name="Status" type="xs:int" minOccurs="0" />
    
        <xs:element name="ResponseTime" type="xs:int" minOccurs="0" />
    
        <xs:element name="ValidateTime" type="xs:int" minOccurs="0" />
    
        <xs:element name="ConnectTime" type="xs:int" minOccurs="0" />
    
        <xs:element name="PostTime" type="xs:dateTime" minOccurs="0" />
    
        <xs:element name="LastValidateTime" type="xs:dateTime" minOccurs="0" />
    
        <xs:element name="Remarks" type="xs:string" minOccurs="0" />
    
        </xs:sequence>
    
       </xs:complexType>
    
       </xs:element>
    
      </xs:choice>
    
      </xs:complexType>
    
     </xs:element>
    
     </xs:schema>
    
     <Proxy>
    
     <IP>10.0.0.2</IP>
    
     <Port>3128</Port>
    
     <Type>-1</Type>
    
     <Status>11</Status>
    
     <ResponseTime>0</ResponseTime>
    
     <ValidateTime>0</ValidateTime>
    
     <ConnectTime>0</ConnectTime>
    
     <PostTime>2010-07-04T11:51:56.89+08:00</PostTime>
    
     </Proxy>
    
    </Proxys>
    
    

    每当执行到 【writer.WriteString( resultXML );】时,就抛出一个 InvalidOperationException 异常,异常消息为:【处于状态 Start 的标记 Text 将导致无效的 XML 文档。 如果要编写 XML 片断,请确保 ConformanceLevel 设置已设置为 ConformanceLevel.Fragment 或 ConformanceLevel.Auto。 】

    难道是 DataSet.WriteXml() 方法生成的XML字符串有错???

    每当执行到 【writer.WriteString( resultXML );】时,就抛出一个 InvalidOperationException 异常,异常消息为:【处于状态 Start 的标记 Text 将导致无效的 XML 文档。 如果要编写 XML 片断,请确保 ConformanceLevel 设置已设置为 ConformanceLevel.Fragment 或 ConformanceLevel.Auto。 】

    这个错误我前段时间正好遇到了,出错的原因当时我不记得了 但是应该是跟编码Encoding有关系的,我用的UTF-8 但是文档编码却为GB2312 好像是这个原因导致的,如果没有xml头声明 那么在写xml的时候应该就会出现一些问题


    I see you~,.NET交流群71840452 微软中文论坛同城社区成都QQ群:74268428http://hi.baidu.com/1987raymondMy Blog~~~
    2010年7月9日 2:49
    版主
  •      // MemoryStream.GetBuffer() 会返回整个Buffer,包含无效的 '\0'
    
         // 所以,使用 Read 方式只读取有效的字符。
    
         byte[] buff = new byte[ms.Length];
    
         ms.Seek(0, SeekOrigin.Begin);
    
         ms.Read(buff, 0, buff.Length);
    
         
    
         // 这个 xml 字符串可以直接返回给客户端。
    
         string xmlResults =Encoding.GetEncoding("GB2312").GetString(buff);
    
    

     

    正确!非常感谢您!!

    同时还要感谢热心回复的朋友,谢谢你们给我的帮助!

    原因就如你所说,最初我的代码返回了整个 MemoryStream 的缓冲区(包含已分配但未使用的空间),然后使用一个 Encoding 对它进行编码以转换成字符。对于 MemoryStream 中已经使用的前半部分字节来说,编码成字符是对的。但对于已分配但未使用的后半部分字节来说,对其编码将产生一些无效的字符,而将这些字符返回给客户端就引发了一楼所描述的错误。

    问题终于解决了!非常高兴!!

    计算机软件技术的乐趣就在于它无穷的创造性和解决问题后所带来的心理愉悦感~~~就像我现在的心情:-)

    2010年7月9日 14:01
  •    using( XmlWriter writer = XmlWriter.Create( fileName, settings ) )
    
    
    
       {
    
    
    
       // Write XML data.
    
    
    
       writer.WriteString( resultXML ); // 就在这里抛出 InvalidOperationException 异常
    
    
    
       writer.Flush();
    
    
    
       }
    
    
    
    

    每当执行到 【writer.WriteString( resultXML );】时,就抛出一个 InvalidOperationException 异常,异常消息为:【处于状态 Start 的标记 Text 将导致无效的 XML 文档。 如果要编写 XML 片断,请确保 ConformanceLevel 设置已设置为 ConformanceLevel.Fragment 或 ConformanceLevel.Auto。 】

    这个错误我前段时间正好遇到了,出错的原因当时我不记得了 但是应该是跟编码Encoding有关系的,我用的UTF-8 但是文档编码却为GB2312 好像是这个原因导致的,如果没有xml头声明 那么在写xml的时候应该就会出现一些问题


    这是我的代码写错了,不应该给 WriteString() 方法传递一个XML字符串。WriteString() 方法是这样用的:

    public class Sample {

      public static void Main() {

         // Create a writer to write XML to the console.
         XmlWriterSettings settings = new XmlWriterSettings();
         settings.Indent = true;
         settings.OmitXmlDeclaration = true;
         XmlWriter writer = XmlWriter.Create(Console.Out, settings);

         // Write the book element.
         writer.WriteStartElement("book");

         // Write the title element.
         writer.WriteStartElement("title");
         writer.WriteString("Pride And Prejudice");
         writer.WriteEndElement();

         // Write the close tag for the root element.
         writer.WriteEndElement();

         // Write the XML and close the writer.
         writer.Close(); 

      }
    }

     

    必须先写一个起始元素后,才能使用 WriteString() 方法写节点文本内容。

    对于我的需求,想把一个XML字符串写入文件,就直接用 FileStream 对象最为简便。

    2010年7月9日 14:05
  • 怎么上传图片呢?

    我想在回复中上传一张图片。

    2010年7月9日 14:13