HR-XML错误,试图反序列化XML示例

时间:2010-01-06 22:28:40

标签: c# xml-serialization

HR-XML 3.0规范提供了WSDL来生成它们的实体。我试图在他们的文档中反序列化他们的示例xml,但它不起作用。

        Candidate.CandidateType candidate = null;
        string path = "c:\\candidate.xml";
        XmlSerializer serializer = new XmlSerializer(typeof(Candidate.CandidateType), "http://www.hr-xml.org/3");
        StreamReader reader = null;
        reader = new StreamReader(path);
        candidate = (Candidate.CandidateType)serializer.Deserialize(reader);

我得到的错误:

"<Candidate xmlns='http://www.hr-xml.org/3'> was not expected."

有什么建议吗?

更新:我尝试过XmlSerializing一个CandidatePerson元素,看起来它使用CandidatePersonType而不是CandidatePerson。我想我在这里做错了......

Candidate.CandidateType的第一行(全部自动生成):

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.hr-xml.org/3")]
public partial class CandidateType {

    private IdentifierType2 documentIDField;

    private IdentifierType2[] alternateDocumentIDField;

    private string documentSequenceField;

2 个答案:

答案 0 :(得分:2)

以下是更多评论,但它太长了,所以我会把它放在这里。

CandidateType类已使用XmlType属性进行了适当的修饰。这是一个适用于类型的属性,用于确定在任何生成的XML模式中如何发出类型。它与碰巧具有相同类型的元素上的命名空间无关。

考虑以下C#代码:

public class CandidateType {}

public class Foo
{
    CandidateType _candidate1;
    CandidateType _candidate2;
}

请注意,您可以拥有多个相同类型的变量。以同样的方式,您可以:

<xs:element name="Candidate1" type="hrx:CandidateType"/>
<xs:element name="Candidate2" type="hrx:CandidateType"/>

这两个元素将针对相同的类型定义进行验证,但这些元素不相关。如果它们位于相同的XML Schema中,那么它们将位于同一名称空间中。但如果他们不是呢?然后你可以有一个实例文档,如:

<ns1:Candidate1 xmlns:ns1="namespace1" xmlns="http://www.hr-xml.org/3"> ... </ns1:Candidate1>
<ns2:Candidate2 xmlns:ns2="namespace2" xmlns="http://www.hr-xml.org/3"> ... </ns1:Candidate2>

您需要做的是为XML Serializer指定Candidate元素的命名空间。 CandidateType类型位于特定名称空间中的事实不会确定Candidate元素的名称空间。

答案 1 :(得分:2)

Muahaha我终于明白了!

John Saunders是对的,我需要在XmlSerializer中指定默认命名空间,但除此之外我必须指定XmlRootAttribute,因为我尝试反序列化的Class与此名称不同根元素。

这是我的反序列化HR-XML ProcessCandidate示例的代码:

    protected static ImportTest.CandidateService.ProcessCandidateType DeserializeProcessCandidate(string path)
    {
        CandidateService.ProcessCandidateType processCandidate = null;
        XmlRootAttribute root = new XmlRootAttribute("ProcessCandidate");
        XmlSerializer serializer = new XmlSerializer(typeof(CandidateService.ProcessCandidateType), new XmlAttributeOverrides(), new Type[0], root, "http://www.hr-xml.org/3");
        StreamReader reader = null;

        try
        {
            reader = new StreamReader(path);
            processCandidate = (CandidateService.ProcessCandidateType)serializer.Deserialize(reader);
            reader.Close();
        }
        catch (Exception ex)
        {
            reader.Close();
            throw (new Exception(ex.InnerException.Message));
        }

        return processCandidate;
    }

感谢John的帮助!