XML验证:以空格开头的十进制属性值

时间:2011-03-01 12:09:04

标签: c# xml xsd

我开发了一个小C#脚本,用于打开XLS文件,解析它并创建一个XML文件列表,根据XSD文件对其进行验证。

我尝试将这些经过验证的文件上传到第三方在线服务(给我文档/ xsd内容的公司),并且一个生成的文件未被接受,因为无效

不接受该文件,因为它在节点属性的十进制值的开头有一个空格;删除此空间可以解决问题。

我创建了一个简单的测试用例,其中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 Parser验证此XML是否正确?
是否有可能强迫Parser对这种格式更加挑剔?

2 个答案:

答案 0 :(得分:3)

如果我正确读取XML规范,则要修剪属性值中的前导空格(如.NET XML解析器所做的那样):

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

“如果属性类型不是CDATA,则XML处理器必须通过丢弃任何前导和尾随空格(#x20)字符[...]来进一步处理规范化的属性值”

答案 1 :(得分:2)

xs:decimal是一种XML Schema类型(不是DTD类型),而relevant part of the XML Schema spec是空格如何应用于xs:decimal:

  

whiteSpace适用于所有人   ·atomic·和·list·数据类型。对全部   ·atomic·数据类型不是字符串   (和类型·由·限制·派生·   从它)whiteSpace的价值是   崩溃,不能改变   架构作者

xs:decimal不是从xs:string派生的,因此应该允许并忽略空格。 “折叠”表示修剪前导和尾随空格,并将内部运行折叠为单个空格字符。