XML反序列化错误 - 不支持处理指令和DTD

时间:2013-12-04 08:50:41

标签: c# xml xsd xml-serialization

我获得了一个XML文件和一个XSD文件。我正在尝试针对XSD验证XML,然后使用Serialization将XML加载到对象中。

我的验证工作正常,但当我尝试DeserializeDocToObj时,我收到以下错误。

There was an error deserializing the object of type 
Aaa.Bbb.Common.DataTypes.SurveyGroup. Processing instructions
(other than the XML declaration) and DTDs are not supported. 
Line 1, position 2.

我不知道这意味着什么,我读过的所有内容并没有真正起作用。

XSD中的标题:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns="http://www.mydomain.co.uk/srm/mscc" 
           targetNamespace="http://www.mydomain.co.uk/srm/mscc" 
           elementFormDefault="qualified" 
           attributeFormDefault="unqualified">
<xs:element name="SurveyGroup">

XML中的标题

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="mscc4_cctv.xsl"?>
<SurveyGroup xmlns="http://www.mydomain.co.uk/srm/mscc" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="
              http://www.mydomain.co.uk/srm/mscc 
              http://www.mydomain.co.uk/srm/schemas/mscc4_cctv.xsd">
<Survey>

反序列化代码:

    public T DeserializeDocToObj(string fileLocation)
    {
        T returnObj;

        using (FileStream reader = new FileStream(fileLocation, FileMode.Open, FileAccess.Read))
        {
            DataContractSerializer ser = new DataContractSerializer(typeof(T));
            returnObj = (T)ser.ReadObject(reader);
        }

        return returnObj;
    }

任何帮助非常感谢

2 个答案:

答案 0 :(得分:1)

字符串<?xml-stylesheet type="text/xsl" href="mscc4_cctv.xsl"?>是处理指令。您的软件告诉您它无法处理其输入中的处理指令。这意味着您的软件似乎不是XML解析器;您需要将输入限制为它可以处理的XML子集,或者获得真正的解析器。

答案 1 :(得分:1)

Create XmlReader XmlReaderSettings并使用DataContractSerializer ReadObject(XmlReader)DataContractSerializer代替ReadObject(Stream)XmlReader:< / p>

using (var reader = XmlReader.Create(fileName, new XmlReaderSettings { IgnoreProcessingInstructions = true }))
{
    var serializer = new DataContractSerializer(typeof(T));
    return (T)serializer.ReadObject(reader);
}

DataContractSerializer使用的Read(Stream)IgnoreProcessingInstructionsDataContractSerializerRead(Stream)XmlDictionaryReader拨打CreateTextReadersource(请参阅XmlUTF8TextReader)创建source(请参阅XmlReaderSettings)不接受processing instructions

显然,默认行为是废话(未知)C.M. Sperberg-McQueen。字符串<?xml-stylesheet type="text/xsl" href="mscc4_cctv.xsl"?>states {{3}}处理指令。