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;
答案 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的帮助!