2012-02-01 103 views
0

我有一個轉換的XML,我一直試圖使用它創建的XSD進行驗證。帶命名空間的XML/XSD

轉換後的XML是:

<?xml version="1.0" encoding="UTF-8"?> 
<ifp:Widget xmlns:ifp="Widget.xsd"> 
    <ifp:Foo>foo</ifp:Foo> 
    <ifp:Bar>bar</ifp:Bar> 
</ifp:Widget> 

它是從(基於原始XML)創建XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
<xs:element name="Widget"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Foo" type='xs:string'/> 
      <xs:element name="Bar" type='xs:string'/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

我得到一個錯誤: CVC-elt.1 :找不到元素'ifp:Widget'的聲明。

回答

1

您的架構沒有提及名爲Widget.xsd的任何名稱空間。 XML應該根本沒有命名空間,即只有<Widget>

無論生成XML需要看什麼,它都會被破壞。

我猜Widget.xsd實際上是你的模式的文件名,但這不屬於你的XML中的名稱空間聲明。

0

要正確有您的XML是指一個XSD使用這樣的事情:

<?xml version="1.0" encoding="UTF-8"?> 
<Widget xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.yourdomain.com Widget.xsd> 
    <Foo>foo</Foo> 
    <Bar>bar</Bar> 
</Widget> 

如果你真的需要定義別名爲「IFP」命名空間做這樣的事情:

<?xml version="1.0" encoding="UTF-8"?> 
<ifp:Widget xmlns:ifp="http://www.yourdomain.com/actualNamespace"> 
    <ifp:Foo>foo</ifp:Foo> 
    <ifp:Bar>bar</ifp:Bar> 
</ifp:Widget> 

當然,你們可以一起使用。

0

「它創建的XSD(基於raw xml)是:」有點混淆......從上下文中,它暗示有一個XSD(您列出),從中生成XML但我不明白「基於raw xml」是什麼意思......你是說XSD是由某種東西產生的嗎?或者說XSD是基於「raw xml」的...換句話說,XSD可能會驗證用作轉換輸入的XML嗎?

作爲添加到已經提供的答案的另一個選項,這裏是與轉換的XML匹配的XSD;這裏的區別是,模式有你「轉化XML」使用的命名空間相匹配的目標命名空間...

<?xml version="1.0" encoding="utf-8"?> 
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)--> 
<xsd:schema xmlns="Widget.xsd" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="Widget.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="Widget"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Foo" type="xsd:string" /> 
     <xsd:element name="Bar" type="xsd:string" /> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
0

字符串的xmlns:IFP =「Widget.xsd」可能是正確的。請參閱Wiki:規範並不完全規定名稱空間名稱的準確規則(它沒有明確指出解析器必須拒絕名稱空間名稱不是有效的統一資源標識符的文檔),並且許多XML解析器允許任何字符串用過的。

但是,您的XSD文件中沒有元素位於該名稱空間中。 Rigth 架構元素在您的XSD文件中:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="Widget.xsd" 
    elementFormDefault="qualified">