2011-03-01 12 views
5

मैं एक छोटे से C# स्क्रिप्ट एक XLS फ़ाइल को खोलता है, यह पार्स करके XML उन्हें एक XSD फ़ाइल के खिलाफ मान्य फ़ाइलों की एक सूची बनाता है कि विकसित किया है के साथ शुरू दशमलव विशेषता मान।XML सत्यापन: एक अंतरिक्ष

मैं एक तीसरे पक्ष के ऑनलाइन सेवा (एक ही कंपनी है कि मुझे प्रलेखन/XSD सामान दिया) और एक उत्पन्न फ़ाइल को स्वीकार नहीं किया जा रहा है क्योंकि मान्य नहीं करने के लिए इन मान्य फ़ाइलों को अपलोड करने की कोशिश की है।

फ़ाइल स्वीकार नहीं की गई है क्योंकि इसमें नोड विशेषता में दशमलव मान की शुरुआत में एक स्थान है; इस जगह को हटाने से समस्या ठीक हो जाती है।

मैंने एक साधारण परीक्षण केस बनाया है जहां XDocument Validate विधि किसी भी समस्या के बिना एक्सएमएल को अतिरिक्त स्थान के साथ मान्य करता है।

Validating doc1 
doc1 validated 

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

यह सही है कि सी # एक्सएमएल पार्सर इस 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); 
     } 
    } 
} 

परिणाम है?
क्या इस स्वरूपण के बारे में पार्सर को और अधिक पसंद करना संभव है?

उत्तर

3

मैं एक्सएमएल कल्पना को सही ढंग से पढ़ रहा हूँ, तो विशेषता मान में अग्रणी व्हाइटस्पेस छांट करने का (के रूप में नेट XML पार्सर करता है) कर रहे हैं:

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

"विशेषता प्रकार CDATA नहीं है , तो एक्सएमएल प्रोसेसर को किसी भी अग्रणी और पिछली जगह (# x20) अक्षरों को छोड़कर सामान्यीकृत विशेषता मान को आगे संसाधित करना चाहिए [...] "

+0

यह दिलचस्प धन्यवाद है; तीसरे पक्ष के गोद लेने वाले पार्सर बिल्कुल कोई ट्रिम नहीं कर रहे हैं। – systempuntoout

2

xs:decimal एक एक्सएमएल स्कीमा प्रकार (डीटीडी प्रकार नहीं) और relevant part of the XML Schema spec है व्हाईटस्पेस xs पर कैसे लागू होता है: दशमलव:

व्हाइटस्पेस सभी · परमाणु · और · सूची · डेटाटाइप पर लागू होता है। सभी के लिए · परमाणु · स्ट्रिंग के अलावा अन्य डेटाटाइप्स (और प्रकार · व्युत्पन्न · द्वारा · प्रतिबंध · यह से) खाली स्थान के का मूल्य पतन है और एक स्कीमा लेखक द्वारा बदला नहीं जा सकता

xs:decimal नहीं है xs:string से व्युत्पन्न, इसलिए व्हाइटस्पेस को अनुमति दी जानी चाहिए और अनदेखा किया जाना चाहिए। "संकुचित" का मतलब अग्रणी और पिछली सफेद जगहों को ट्रिम करना और एकल अंतरिक्ष वर्णों में आंतरिक रनों को ध्वस्त करना है।

संबंधित मुद्दे