2011-03-01 60 views
5

我開發了一個小的C#腳本,該腳本打開XLS文件,對其進行解析並創建一個XML文件的列表,以便與XSD文件進行驗證。XML驗證:以空格開頭的十進制屬性值

我試圖上傳這些驗證的文件到第三方在線服務(同一家公司,給了我的文檔/ 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解析器驗證這個XML?
是否有可能強制解析器對這種格式更挑剔?

回答

3

如果我正確讀取XML規範,在屬性的值導致空格都被修剪(如.NET的XML解析器一樣):

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

「如果屬性的類型不是CDATA ,那麼XML處理器必須通過丟棄任何前導和尾隨空格(#x20)字符[...]來進一步處理歸一化屬性值「

+0

這是有趣的感謝;第三方採用的解析器似乎根本沒有做任何修剪。 – systempuntoout 2011-03-01 15:01:07

2

xs:decimal是XML模式類型(不是DTD類型),並且relevant part of the XML Schema spec是空格是如何應用於xs:decimal的:

whiteSpace適用於所有 ·原子和列表數據類型。對於所有 ·原子·比串 其它數據類型(和類型·由派生··限制· 從它)的空白值是 崩塌,不能由一個 模式的作者來改變

xs:decimal不來自xs:string,所以應該允許並忽略空白。 「摺疊」表示修剪前導空白和尾隨空白,並將內部運行摺疊爲單個空格字符。