【问题标题】:How Can I add XML declaration?如何添加 XML 声明?
【发布时间】:2025-12-08 19:55:02
【问题描述】:

我有这个来自 URL XML 的 Xml 输出 使用 HTTP GET 方法

如何添加此 XML 声明?

?xml version="1.0" encoding="ISO-8859-1"?>

这是服务合同

[ServiceContract]
public interface IService1
{
    [OperationContract]
          [WebInvoke(Method = "GET",
          ResponseFormat = WebMessageFormat.Xml,
          //BodyStyle = WebMessageBodyStyle.Wrapped,
          UriTemplate = "{id}")]

    XElement GetRecipesByID(string id);

这是实现, 我将 DataTable 转换为 Xml 并从 URL 获取

public XElement GetRecipesByID(string id)
    {
        StringWriter str = new StringWriter();
        DataSet dataSet = new DataSet();
        dataSet.Tables.Add(Table);
        XmlTextWriter xtext = new XmlTextWriter(str);
        xtext.Formatting = Formatting.Indented;
        xtext.WriteStartDocument();
            xtext.WriteStartElement("rss");
            xtext.WriteAttributeString("version", "2.0");
            xtext.WriteStartElement("channel");
            xtext.WriteElementString("title", "GetCard");
            xtext.WriteElementString("link", "10.0.0.253");
            xtext.WriteElementString("lastBuildDate", " ");
            xtext.WriteElementString("generator", "Alikas Feed");
            xtext.WriteElementString("error", error);
            xtext.WriteElementString("cardid", "RX0016502");
            xtext.WriteElementString("name", " ");
            xtext.WriteElementString("passport_id", "60001082881");
            xtext.WriteElementString("tel", " ");
            xtext.WriteEndElement();
            xtext.WriteEndDocument();

            result = str.ToString();

        xtext.Close();

        XmlDocument doc = new XmlDocument();
        doc.Save(str);


        return XElement.Parse(result);

    }

当我将此 xml 保存在文件中时,有 xml 声明,但是当我尝试从 URL 获取此 xml 时,xml 声明不显示。 我需要从 URL 中显示此声明。 谢谢

【问题讨论】:

    标签: c# .net xml wcf declaration


    【解决方案1】:

    WriteStartDocument 应该已经添加了 XML 声明。它使用您的TextWriter 指定的Encoding

    您使用的是StringWriter,它将始终将 UTF-16 报告为 .NET 字符串采用 UTF-16。要获得 ISO-8859-1,您需要使用显式编码构造 StreamWriter 或其他 TextWriter

    您是否考虑过直接创建XDocument?在这种情况下无需使用XmlWriter

    【讨论】:

    • 是的,我尝试使用 XDocument 但结果相同。当我在文件中写这个 xml 时,我有 XML 声明,但在 Chrome 中没有显示。
    • 如果它在文件中,它就在文件中,所以听起来这不是代码问题。 Chrome 只是没有显示它。
    【解决方案2】:

    尝试以下:

                string header = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><rss version=\"2.0\"/>";
                XDocument doc = XDocument.Parse(header);
    
                XElement rss = doc.Root;
    
                Boolean error = false;
                rss.Add(new XElement("channel", new object[] {
                    new XElement("title", "GetCard"),
                    new XElement("link", "10.0.0.253"),
                    new XElement("lastBuildDate", " "),
                    new XElement("generator", "Alikas Feed"),
                    new XElement("error", error),
                    new XElement("cardid", "RX0016502"),
                    new XElement("name"),
                    new XElement("passport_id", "60001082881"),
                    new XElement("tel")
                }));
    
                doc.Save(@"c:\temp\test.xml");
    

    【讨论】:

      【解决方案3】:

      对此有一种特殊的方法:

      var xmlDoc = new XmlDocument();
      xmlDoc.CreateXmlDeclaration("1.0", "ISO-8859-1", null);
      xmlDoc.Save(str);
      

      msdn on encoding 参数的注意事项:这是将 XmlDocument 保存到文件或流时使用的编码;因此,必须设置为Encoding类支持的字符串,否则保存失败。

      【讨论】:

        【解决方案4】:

        这似乎对我有用

        XDocument xel = XDocument.Parse(  "<root><el>123</el></root>" );
        xel.Declaration = new XDeclaration( "1.0","UTF-8","true" );
        xel.Save( @"c:\temp.xml" );
        

        【讨论】: