XDocument XDeclaration not appearing in ToString result

老子叫甜甜 提交于 2020-01-02 04:53:06

问题


I am trying to form an XML document which I will be using to send as over HTTPS to an API, however I have noticed that even though I have added an XDeclaration element to my XML the XDeclaration does not appear in the string that I return using xmlDoc.ToString() method.

Does anyone know if I am missing a particular setting or any reason why the <?xml version="1.0" encoding="UTF-8" ?> elements are not appearing?

xmlDoc = new XDocument(
            new XDeclaration("1.0", "UTF-8", "yes"),
            new XElement("NABTransactMessage",
                new XElement("MessageInfo",
                    new XElement("MessageID", "5167813675aa47d181a7c76979f2de00"),
                    new XElement("MessageTimeStamp", "20152701024752898882+000"),
                    new XElement("timeoutValue", 60),
                    new XElement("apiVersion", "spxml-4.2")
                ),
                new XElement("MerchantInfo",
                    new XElement("MerchantID", "XYZ0010"),
                    new XElement("password", "abcd1234")
                ),
                new XElement("RequestType", "Periodic"),
                new XElement("Periodic",
                    new XElement("PeriodicList", new XAttribute("count", 1),
                        new XElement("PeriodicItem", new XAttribute("ID", 1),
                            new XElement("actionType", "addcrn"),
                            new XElement("periodicType", 5),
                            new XElement("crn", "85c2960d-1422326872"),
                            new XElement("CreditCardInfo", 
                                new XElement("cardNumber", 4111111111111111),
                                new XElement("expiryDate", "08/20"),
                                new XElement("cvv", 123)
                            )
                        )
                    )
                )
            )
        );

return xmlDoc.ToString(SaveOptions.None);

Code to Send Request via HTTPS:

    public static string SendRequest(string requestContent, string requestContentType, string requestUrl)
    {
        try
        {
            var request = (HttpWebRequest)WebRequest.Create(requestUrl);
            byte[] bytes;

            bytes = System.Text.Encoding.UTF8.GetBytes(requestContent);

            request.ContentType = requestContentType + "; encoding='utf-8'";
            request.ContentLength = bytes.Length;
            request.Method = "POST";
            //request.Timeout = 5000;

            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

            using (var requestStream = request.GetRequestStream())
            {
                requestStream.Write(requestContent, 0, requestContent.Length);
            }

            using (var response = (HttpWebResponse)request.GetResponse())
            {
                using (var responseStream = response.GetResponseStream())
                {
                    return new StreamReader(responseStream).ReadToEnd();
                }
            }
        }

NOTES: xmlDoc.ToString() value is being passed to SendRequest() as the first parameter, requestContentType is being set to "text/xml"


回答1:


XDocument.ToString() doesn't include the declaration. Instead, use XDocument.Save(), e.g.:

    public static string ToXml(this XDocument xDoc)
    {
        StringBuilder builder = new StringBuilder();
        using (TextWriter writer = new StringWriter(builder))
        {
            xDoc.Save(writer);
            return builder.ToString();
        }
    }

If specifically you need to make the encoding string say "UTF-8", see here: Force XDocument to write to String with UTF-8 encoding

Note that this extension is for XDocument, not XmlDocument which has OuterXml.




回答2:


Serializing to string can't preserve Utf-8 declaration as it will not be valid at that point - so it will be removed.

You need to save the data to stream if you need Utf-8 (default) encoding. Sample and more discussion - Serializing an object as UTF-8 XML in .NET.



来源:https://stackoverflow.com/questions/28183461/xdocument-xdeclaration-not-appearing-in-tostring-result

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!