代码之家  ›  专栏  ›  技术社区  ›  Hansen

将Xml反序列化为对象时出错-{<string-xmlns='http://tempuri.org/“>不是预期的。}

  •  0
  • Hansen  · 技术社区  · 7 年前

    我在尝试将XML反序列化为对象时遇到问题, 我收到错误消息

    "There is an error in XML document (2, 2)."
    

    内部异常:

    "<string xmlns='http://tempuri.org/'> was not expected."
    

    我在以下链接中尝试了解决方案: Error Deserializing Xml to Object - xmlns='' was not expected , xmlns=''> was not expected. - There is an error in XML document (2, 2) while DeserializeXml to object

        bulk_response result = ConvertXMLString.convertXMLStringToObject<bulk_response>(response);
    

    以下是我的反序列化代码:

    public static T convertXMLStringToObject<T>(string input) where T : class
            {
                try
                {
                    System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
    
                    using (StringReader sr = new StringReader(input))
                    {
                        return (T)ser.Deserialize(sr);
                        sr.Close();
                    }
                }
                catch (Exception ex)
                {
                    return null;
                }
            }
    

    这是我的课:

      public class bulk_response
        {
            public string status_code { get; set; }
            public string status_text { get; set; }
            public string transaction_id { get; set; }
        }
    

    我找不到什么问题?

    这是我从http post响应中获得的xml:

    <?xml version="1.0" encoding="utf-8"?>
    <string xmlns="http://tempuri.org/"><?xml version="1.0" encoding="utf-16"?>
    <bulk_response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <status_code>hansen</status_code>
      <status_text>angie</status_text>
      <transaction_id>ini testing aja</transaction_id>
    </bulk_response></string>
    

    HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(destinationUrl);
    // add the parameters as key valued pairs making
    // sure they are URL encoded where needed
    ASCIIEncoding encoding = new ASCIIEncoding();
    byte[] postData = encoding.GetBytes(param);
    httpReq.ContentType = "application/x-www-form-urlencoded";
    httpReq.Method = "POST";
    httpReq.ContentLength = postData.Length;
    // convert the request to a steeam object and send it on its way
    Stream ReqStrm = httpReq.GetRequestStream();
    ReqStrm.Write(postData, 0, postData.Length);
    ReqStrm.Close();
    // get the response from the web server and
    // read it all back into a string variable
    HttpWebResponse httpResp = (HttpWebResponse)httpReq.GetResponse();
    StreamReader respStrm = new StreamReader(
    httpResp.GetResponseStream());
    string result = respStrm.ReadToEnd();
    httpResp.Close();
    respStrm.Close();
    
    return result;
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Paul Kertscher    7 年前

    如何序列化XML?看起来很糟糕。

    1. 额外的 <?xml ... <string> 标签在我看来很奇怪。我从未见过这个。这是有效的XML吗?
    2. 当从XML反序列化对象时,序列化程序希望根节点的名称与类的名称相同。这是什么 <string> was not expected. 意味着-它期望 bulk_response
    3. 的结束标记 status_text 不是结束标记,应该是 <status_text>angie</status_text>
    4. xmlns 不同级别的定义也不常见(如果它是合法的XML的话)-但我不明白为什么您需要它们,您可以把它们留下

    <?xml version="1.0" encoding="utf-8"?>
    <bulk_response>
      <status_code>hansen</status_code>
      <status_text>angie</status_text>
      <transaction_id>ini testing aja</transaction_id>
    </bulk_response>
    

    你的代码很有魅力。问题似乎不是反序列化代码,而是服务器端的序列化代码。