2013-02-19 79 views
1

XML發佈之前驗證數據我寫從存儲器讀取逗號分隔值(和它們的標籤)的字符串,並將它們打包到一個XML文件發送服務。數據所有者使用每個XML結構正在生成關聯的XSD文件。在通過Web服務發佈XML之前,我想讀取和XSD文件以驗證.txt文件中的數據標籤列表。如果檢測到XSD和txt文件之間存在差異,我希望代碼拋出異常。在成功匹配時,它會從.txt文件,包中提取值,併發布XML請求。我正在尋找整個過程(從輸入到輸出)的一個例子,說明如何完成這個過程。利用XSD通過Web服務

讀取輸入文件並收集屬性和值(TestValuesIN.txt)

"test.Foo", 122; 

打開XSD文件和對元素的我輸入文件的列表中的元素進行一到一個匹配。現在我只關心XSD中存在的「Test.Foo」(元素:Test.Foo val :)。 (TextXSD.xsd)

<?xml version="1.0"?> 
<!-- Generated using Flame-Ware Solutions XML-2-XSD v2.0 at http://www.flame-ware.com/Products/XML-2-XSD/ --> 
<xs:schema id="batch-execution" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xs:element name="batch-execution" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
     <xs:complexType> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element name="insert"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="test.Foo" minOccurs="0" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="val" type="xs:string" minOccurs="0" /> 
            </xs:sequence> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="fire-all-rules"> 
        <xs:complexType> 
         <xs:attribute name="max" type="xs:string" /> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="get-objects"> 
        <xs:complexType> 
         <xs:attribute name="out-identifier" type="xs:string" /> 
        </xs:complexType> 
       </xs:element> 
      </xs:choice> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

然後,XML發佈到

http://mycamelhump.<myurl>.com:8080/drools-camel-service/kservice/CommTestXML/execute 

URI

<batch-execution> 
<insert> 
    <test.Foo> 
    <val>122</val> 
    </test.Foo> 
</insert> 
<fire-all-rules max="-1"/> 
<get-objects out-identifier="also-foo"/> 
</batch-execution> 

的代碼獲得的結果打印輸出到(TestValuesOUT.txt)

"Test.Foo", 100; 
+0

問題在哪裏? – walther 2013-02-19 17:57:01

+1

感謝Walther。在寫這篇文章的熱潮中,我錯過了這個問題。 – Nanohurtz 2013-02-19 18:27:46

+0

那麼你想在將CSV文件轉換爲XML之前驗證它的內容嗎?這就是你要求的一個例子嗎? – 2013-02-19 18:30:45

回答

0

如果試圖創建XML文檔和使用什麼樣的。 NET XML schemaset驗證XML你把它發佈到Web服務之前 - 這樣的:

public List<string> ValidateXml(string xml, string rootXsdName) 
    { 
     List<string> xsdValidationErrors = new List<string>(); 

     try 
     { 
      // Note: Don't use XDocument schema validation as this will give a false positive of a string without XSD specified  
      XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.ValidationType = ValidationType.Schema; 
      settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; 
      settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
      settings.ValidationEventHandler += ((o, e) => xsdValidationErrors.Add(e.Message)); 
      settings.Schemas = GetXmlSchemas(rootXsdName); 

      TextReader textReader = new StringReader(xml); 
      XmlReader reader = XmlReader.Create(textReader, settings); 

      // Parse the file.   
      while (reader.Read()) 
      { 
       //Empty control loop to read through entire document getting errors uaing ValidationEventHandler 
      } 
     } 
     catch (Exception ex) 
     { 
      xsdValidationErrors.Add("Unable to parse XML"); 
     } 


     return xsdValidationErrors; 
    } 

而且GetXmlSchemas的實施,將這個樣子......

/// <summary> 
    /// Generates an XmlSchema set to use to validate the xDocument 
    /// </summary> 
    private XmlSchemaSet GetXmlSchemas(string xsdFileName) 
    { 
     XmlSchemaSet schemas = new XmlSchemaSet(); 

     // ... build the schema set here 

     return schemas; 
    } 

所以 - GetXmlSchemaSet將加載在所有您的xsd文件(如果您有多個文件)

HTH

+0

傑伊好問題。我們的規則引擎的XSD不會將我們的XML與XML結合。 XSD反映了Apache安排在Apache中的方式,而XML則是用於我們的.NET編碼器打包和發送消息。我想通過閱讀ASD並將其與輸入文件進行比較,從而一石二鳥。這總是會告訴我,XML模式是否不正確。直到我們可以根據ASD文件讓JAXb生成XML之後,此「代碼遍歷」纔是臨時修復。 – Nanohurtz 2013-02-19 21:53:29