簡體   English   中英

XML驗證:以空格開頭的十進制屬性值

[英]XML validation: decimal attribute value starting with a space

我已經開發了一個小的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是否正確?
是否可以強制解析器對此格式更挑剔?

如果我正確地閱讀了XML規范,則將修剪屬性值中的前導空格(如.NET XML解析器所做的那樣):

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

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

xs:decimal是XML Schema類型(不是DTD類型),並且XML Schema規范相關部分是空白如何應用於xs:decimal:

whiteSpace適用於所有原子和列表數據類型。 對於除字符串以外的所有原子數據類型(以及由其派生的類型),whiteSpace的值是折疊的,不能由架構作者更改

xs:decimal不是從xs:string派生的,因此應該允許和忽略空格。 “折疊”是指修剪前導和尾隨空白,並將內部游程折疊成單個空格字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM