我开发了一个小的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 Parser验证此XML是否正确?
是否有可能强迫Parser对这种格式更加挑剔?
解决方法:
如果我正确地读取XML规范,则要修剪属性值中的前导空格(如.NET XML解析器所做的那样):
http://www.w3.org/TR/REC-xml/#AVNormalize
“如果属性类型不是CDATA,那么XML处理器必须通过丢弃任何前导和尾随空格(#x20)字符[…]来进一步处理规范化的属性值”