2013-09-12 5 views
1

Я пытаюсь преобразовать XML-файл в объект при удалении XML-тега, я ожидаю исключения, потому что мой XML-файл больше недействителен, но я до сих пор мой объект данных с удаленным тегом (свойство) имеет значение null. Как сделать этот конкретный тег необходимым, поэтому, пытаясь его сериализовать, он выдает исключение, говорящее, что тег xxx отсутствует => Файл XML недействителен =>, поэтому объект данных также является нулевым.Создание тега XML, требуемого при сериализации (C#)

Мой XSD

... 
<xs:element name="Language" minOccurs="1" maxOccurs="1"> 
... 

Мой XML

<?xml version="1.0" encoding="iso-8859-1"?> 
<root> 
    <item> 
    <sub1>1037</sub1> 
    <Language>F</Language><!-- If I delete this tag, my XML file should be invalid --> 
    <sub1>ZDC</sub1> 
    </item> 
<root> 

Мой сериализации boject

... 
     /// <remarks/> 
     public string Language 
     { 
      get 
      { 
       return this.languageField; 
      } 
      set 
      { 
       this.languageField = value; 
      } 
     } 
... 
+4

Проверить [Может ли я не выполнять десериализацию с помощью XmlSerializer в C#, если элемент не найден?] (Http://stackoverflow.com/questions/259726/can-i-fail-to-deserialize-with-xmlserializer- in-c-sharp-if-an-element-is-not-fou) – Lloyd

+2

Почему бы не проверять себя перед сериализацией? – Rotem

+0

Я сгенерировал свой объект сериализации с помощью xsd.exe с помощью XSD-файла, и я подумал, что minOccurs = «1» maxOccurs = «1» сделает трюк, чтобы сделать мой тег, но он этого не сделал! Как сделать свойство «Язык» обязательным для использования атрибутов или что-то в этом роде? – Stacked

ответ

2

Я в конечном итоге с dding файлов XSD для моего решения, как Внедренный ресурс и с помощью этого метода:

public static void ValidateXmlFile<T>(string file, string xsdPath) 
{ 
    var assembly = typeof(T).Assembly; 
    var assName = assembly.GetName().Name; 
    var xsdFullPath = String.Format("{0}.{1}", assName, xsdPath); 
    var schema = assembly.GetManifestResourceStream(xsdFullPath); 
    if (schema == null) 
     throw new Exception(String.Format("{0} could not be validated, the XSD schema {1} not found", file, xsdFullPath)); 
    var xmlIsValid = true; 
    var errorMsg = String.Empty; 
    var schemaReader = XmlReader.Create(schema); 
    var settings = new XmlReaderSettings(); 
    settings.Schemas.Add(null, schemaReader); 
    settings.ValidationType = ValidationType.Schema; 
    settings.ValidationEventHandler += (sender, args) => 
    { 
     xmlIsValid = false; 
     errorMsg = args.Message; 
    }; 

    using (var stream = new FileStream(file, FileMode.Open)) 
    { 
     var xr = XmlReader.Create(stream, settings); 
     while (xr.Read()) { } 
     if (!xmlIsValid) throw new Exception(String.Format("XML file {0} is not valid: {1}", file, errorMsg)); 
    } 
} 

При обнаружении ошибок, генерируется исключение с сведением об ошибке.

Смежные вопросы