【问题标题】:There is an error in XML document (2, 2): how to deserialize this xml?XML 文档中存在错误(2、2):如何反序列化此 xml?
【发布时间】:2014-11-28 10:26:52
【问题描述】:

我有一个需要反序列化为带有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;
}

当默认命名空间“http://www.defaultnamespace.com/xsd/MyObject12”与以下 xml 字符串一起传递时:(其中新行是“\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)。

内部异常:{http://www.example.com/xsd/MyObject12'> 不是预期的。"}

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

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

【问题讨论】:

  • 我只是在猜测(抱歉):命名空间不是只能在声明它的元素的子/后代元素中使用吗?所以它应该由 ?

标签: c# xml xsd


【解决方案1】:

这是一个示例代码。它工作正常。它所做的唯一更改是从 xml 字符串中删除 &lt;xml version='1.0' encoding='utf-8'?&gt;

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; }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    相关资源
    最近更新 更多