Ошибка HR-XML при попытке десериализации примеров XML - PullRequest
1 голос
/ 07 января 2010

Спецификация 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 ]

2 голосов
/ 08 января 2010

Муахаха Я наконец-то понял!

Джон Сондерс был прав, мне нужно было указать пространство имен по умолчанию в XmlSerializer, но в дополнение к этому я должен указать XmlRootAttribute, потому что класс, которым я являюсьпопытка десериализации не имеет того же имени, что и корневой элемент.

Вот мой код для десериализации примера 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;
    }

Спасибо за помощь, Джон!

2 голосов
/ 07 января 2010

Ниже приведен комментарий, но он слишком длинный, поэтому я выложу его здесь.

Класс 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-схеме, они будут в одном и том же пространстве имен. Но что, если они не? Тогда вы можете получить экземпляр документа, например:

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

Вам нужно указать пространство имен элемента Candidate для сериализатора XML. Тот факт, что тип CandidateType находится в определенном пространстве имен, не определяет пространство имен элемента Candidate.

...