Как проверить XML-файл по HR-XML с помощью C # - PullRequest
2 голосов
/ 21 июня 2011

Я ищу несколько советов и рекомендаций для проверки HR-XML.

Я написал код для создания XML-файла, который " должен " быть правильно отформатирован как HR-XML, но я хочу проверить его с помощью кода перед записью на диск .

Ниже приведен пример кода моего метода проверки и обработчика события ошибки проверки

/// <summary>
/// Validate the populated XML
/// </summary>
/// <remarks>
/// The schema folder needs to be "HR-XML-3_0" which contains the "org_hr-xml" and "org_openapplications_platform" folders
/// </remarks>
/// <param name="schemaPath">The root path for the HR-XML XSD files for the xml to be validated against</param>
/// <returns>true if the xml is valid, else false</returns>
public bool Validate(string schemaPath)
{
    try
    {
        // Initalise the valid flag
        this.m_FormatValid = false;
        this.m_ValidationErrors.Clear();

        // Check if there is anything to output
        if (this.m_Root.HasElements == true)
        {
            // Validate that the root node has been populated correctly
            XDocument doc = new XDocument(m_Root);

            XmlSchemaSet schemas = new XmlSchemaSet();

            // Add the schemas in the specified folder to the schema set
            schemas.Add(XmlSchema.Read(new StreamReader(Path.Combine(schemaPath, @"org_hr-xml\3_0\Developer\BODs\RespondHRMasterData.xsd")), null));
            schemas.Add(XmlSchema.Read(new StreamReader(Path.Combine(schemaPath, @"org_openapplications_platform\1_1\Common\OAGi\Components\Meta.xsd")), null));

            // Set the valid flag to true prior to validation and let the event handler set it to false if it's not valid
            this.m_FormatValid = true;

            doc.Validate(schemas, HRXML_Validation_Error);
        }
        else
        {
            Log.WriteLine(Category.Info, "No HR-XML data to validate");
        }
    }
    catch (Exception ex)
    {
        this.m_FormatValid = false;
        Log.WriteLine(Category.Warning, "An error was detected whilst validating HR-XML data", ex);
    }

    return this.m_FormatValid;
}



/// <summary>
/// Event handler for XML validation errors
/// </summary>
void HRXML_Validation_Error(Object source, ValidationEventArgs args)
{
    // There is no need to worry about the severity of the validation as they should always be errors
    // The warning appears only to be triggered is no schema has been specified which shouyldn't be the case here

    // Output the message to the validation list
    this.m_ValidationErrors.Add( args.Message );

    //Set the Valid flag to false
    m_FormatValid = false;
}

Я добавил BOD для ответа на запросы HRMasrterData в набор схем, но это породило исключение из-за импортированной схемы, на которую есть ссылка в файле RespondHRMasterData.xsd . Ошибка была Неопределенный complexType 'http://www.openapplications.org/oagis/9:BusinessObjectDocumentType' используется в качестве основы для расширения сложного типа.

Добавление второго файла в набор схем разрешило первое исключение и дало это. Тип 'http://www.openapplications.org/oagis/9:NormalizedStringType' не объявлен или не является простым типом.

Что мне не нужно делать, так это добавлять все файлы схемы HR-XML (если только мне это не нужно), прежде чем я получу, и "фактические" ошибки в созданном файле.

Я на правильном пути или есть лучший способ сделать это?

Спасибо.

1 Ответ

1 голос
/ 19 июля 2011

Лучший способ проверить HR-XML - это добавить узел xsi: schemaLocation в сгенерированный xml, который указывает на требуемый BOD.

Также возможно создать проект XML Spy, на который ссылаются все файлы схемы. Если это сделано, расположение схемы не требуется.

...