Проверка XML: десятичное значение атрибута, начинающееся с пробела - PullRequest
5 голосов
/ 01 марта 2011

Я разработал небольшой скрипт C#, который открывает файл XLS, анализирует его и создает список файлов XML, проверяющих их по файлу XSD.

Я пытался загрузить эти проверенные файлы в стороннюю онлайн-службу (ту же компанию, которая предоставила мне документацию / xsd), и один сгенерированный файл не принимается, потому что NOT VALID .

Файл не принят, потому что в нем есть пробел в начале десятичного значения в атрибуте узла; удаление этого пробела устраняет проблему.

Я создал простой тестовый пример, в котором метод XDocument Validate проверяет XML с лишним пробелом без проблем.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Schema;
using System.Xml.Linq;
using System.Xml;
using System.IO;

namespace TestParser {
    class Program {
        static void Main(string[] args) {
            string xsdMarkup =
            @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
                <xs:element name='option'>
                    <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base='xs:string'>
                        <xs:attribute name='value' type='xs:decimal'>
                        </xs:attribute>
                        </xs:extension>
                    </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
                </xs:schema>";
        XmlSchemaSet schemas = new XmlSchemaSet();
        schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));

        XDocument doc1 = new XDocument(
            new XElement("option","test", new XAttribute("value", " 423423")
            ));    
        Console.WriteLine("Validating doc1");
        bool errors = false;
        doc1.Validate(schemas, (o, e) =>
                                    {
                                        Console.WriteLine("{0}", e.Message);
                                        errors = true;
                                    }, true);
        Console.WriteLine("doc1 {0}", errors ? "not valid" : "validated");
        Console.WriteLine();
        Console.WriteLine("Contents of doc1:");
        Console.WriteLine(doc1);
        }
    }
}

Результат таков:

Validating doc1
doc1 validated

Contents of doc1:
<option value=" 423423">test</option>

Правильно ли, что синтаксический анализатор C # XML проверяет этот XML?
Можно ли заставить анализатор быть более разборчивым в этом форматировании?

Ответы [ 2 ]

3 голосов
/ 01 марта 2011

Если я правильно читаю спецификацию XML, начальные пробелы в значениях атрибута должны быть обрезаны (как это делает анализатор XML .NET):

http://www.w3.org/TR/REC-xml/#AVNormalize

"Еслитип атрибута не CDATA, тогда процессор XML ДОЛЖЕН дополнительно обрабатывать нормализованное значение атрибута, отбрасывая любые символы начального и конечного пробела (# x20) [...] "

2 голосов
/ 03 марта 2011

xs:decimal - это тип схемы XML (не тип DTD), а соответствующая часть спецификации схемы XML - это то, как пробельные символы применяются к xs: десятичное число:

whiteSpace применимо ко всем типам данных · atomic · и · list ·.Для всех · атомарных · типов данных, кроме строки (и типов · производных · от · ограничения · из него), значение whiteSpace является свернутым и не может быть изменено автором схемы

xs:decimal непроисходит от xs:string, поэтому пробел должен быть разрешен и игнорироваться.«Свернуть» означает обрезать начальные и конечные пробелы и свернуть внутренние пробелы в одиночные пробелы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...