XML文档中存在错误(2,2):如何反序列化此xml?

时间:2014-11-28 10:26:53

标签: c# xml xsd

我有一个需要反序列化为XmlSerializer的对象的xml文档:

执行此操作的方法采用默认命名空间和xml字符串:

public static T Deserialize(string xml, string defaultNamespace)
{
    var serializer = new XmlSerializer(typeof(T), defaultNamespace);
    object obj;
    using (var stringReader = new StringReader(xml))
    {
        obj = serializer.Deserialize(stringReader);
        stringReader.Close();
    }
    return (T)obj;
}

当使用以下xml字符串传递默认命名空间“http://www.defaultnamespace.com/xsd/MyObject12”时:(其中新行为“\ n \ r”)

<xml version="1.0" encoding="utf-8"?>
<ns:MyObject12 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:ns1="http://example.com/xsd/example11" 
             xmlns:xs="http://www.w3.org/2001/XMLSchema" 
             xmlns:ns="http://www.example.com/xsd/MyObject12">
  <Status xmlns="some:stuff">
    <StatusCode>0</StatusCode>
  </Status>
</ns:MyObject12>

抛出以下异常:

  

System.Xml.dll中出现“System.InvalidOperationException”类型的异常但未在用户代码中处理

附加信息:XML文档中存在错误(2,2)。

内部例外:{&lt; MyObject12 xmlns ='http://www.example.com/xsd/MyObject12'&gt;没想到。“}

我尝试通过将ns:添加到所有xml元素来修复它,但发生了同样的错误。

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

以下是示例代码。它运作正常。只更改它从xml字符串中删除<xml version='1.0' encoding='utf-8'?>

class Program
    {
        static void Main(string[] args)
        {
            const string xml = @"<ns:MyObject12 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:ns1='http://example.com/xsd/example11' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:ns='http://www.example.com/xsd/MyObject12'><Status xmlns='some:stuff'><StatusCode>0</StatusCode></Status></ns:MyObject12>";
            var myObject12 = Deserialize<MyObject12>(xml, "http://www.example.com/xsd/MyObject12");
        }

        public static T Deserialize<T>(string xml, string defaultNamespace)
        {
            var serializer = new XmlSerializer(typeof(T), defaultNamespace);
            object obj;
            using (var stringReader = new StringReader(xml))
            {
                obj = serializer.Deserialize(stringReader);
                stringReader.Close();
            }
            return (T)obj;
        }


    }

    [Serializable]
    public class MyObject12
    {
        [XmlElement]
        public int StatusCode { get; set; }
    }