2010-07-01 100 views
84

我知道我之前已經完成了這項工作,但它今天無法工作,我也無法找到解釋如何執行此操作的任何地方。這可能是我缺乏睡眠,但我懷疑是小孩。在Visual Studio IDE中使用XSD進行XML驗證

我有一個XML文檔和一個完整的定義它的XSD的目錄。如何將Visual IDE設置爲向我通知驗證失敗,然後在給定上下文中提供有效標籤和屬性的智能感知列表?

我曾嘗試:

  • 我已經添加了XSD的與XML文檔的項目。
  • 我已將XSD添加到XML架構列表(在XML/Schemas ...菜單項下)。
  • 我甚至已經將schemaLocation和noNamespaceSchemaLocation屬性包含到XML文檔中。

Visual Studio仍然沒有放棄任何有用的調試或編輯信息。我嘗試了2010年和2008年(我以前在2008年之前完成過這項工作,我認爲)

更新:我有另一位開發人員嘗試了這一點,但他也失敗了。他知道他已經用其他XML文檔完成了它,並使其工作。然後我下載氧XML編輯器,它在相同的XML和XSD文件工作得很好,所以這些文件似乎是罰款(或氧氣是更寬容/靈活。)

回答

115

吉姆,

您需要在XML文檔中的Visual Studio與XSD文件相關聯,你有 - 你應該看到像這樣的XML文檔的屬性窗口:

alt text

Mirror 1

在XML模式集編輯器中(當您在屬性窗口的「模式」文本框中單擊(...)省略號時打開),您需要確保您的模式存在。此外,請確保該架構Use列啓用 - 如果不是,點擊它 - 你會得到的選項的下拉列表,挑一個Use與綠色的勾號:

alt text

Mirror 1

確保Visual Studio的錯誤列表窗口可見(菜單視圖>錯誤列表)。這將顯示XML和XSD模式定義之間的所有不一致。

一旦所有的即到位,在Visual Studio XML編輯器應該使用藍色squigglies突出的編輯與你的XML問題:

alt text

Mirror 1

+0

謝謝,這是一個很好的詳細解釋,但我仍然沒有工作。我不知道你可以從這樣的屬性中獲得模式列表。 – 2010-07-01 20:49:53

+0

@Jim McKeeth:如果您修改XML並再次保存,該怎麼辦?有時XML驗證需要一個觸發器... – 2010-07-01 21:15:23

+0

即使它不適合我,我也接受了您的答案。我猜測我的系統剛剛結束,但我已經搬到新電腦上,現在一切正常。 – 2010-10-21 21:19:50

1

請問您的XSD包含屬性「targetNamespace」/ schema/@ targetNamespace與您在xml中引用的命名空間類似嗎?

實施例:

的xsd: <的xs:架構....的targetNamespace = 「Datafile.xsd」 ...>

XML: <數據的xmlns = 「Datafile.xsd」>。 ..

又見XML/XSD intellisense not working in Visual Studio 2010

0

我有同樣的問題,但在VS引用我的架構正確了。原來我想驗證的文件沒有'xml'文件擴展名。在我的文件名末尾添加了.xml,驗證開始生效。

29

您不需要手動關聯Visual Studio中的文件 - 它會自動將XML文件與XSD文件匹配(如果您將它們都打開並且您已正確定義了您的名稱空間)。

要定義命名空間:在使用類型

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

的說明:

在XML文件中的根元素:

<Data xmlns='http://yourdomain.com/yourschema.xsd'> 
    ... 
</Data> 

在XSD文件的架構元素當你有目標時你的模式名稱空間

因爲你指定在你的架構中targetNamespace,在模式中定義的類型的任何引用都需要一個命名空間前綴(這就是爲什麼我們在上面<xs:schema />元素添加xmlns:this屬性)。

<!-- Define the type as normal --> 
<xs:complexType name="Row"> 
    <xs:sequence> 
     <xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1" /> 
     <xs:element name="Value" type="xs:float" minOccurs="1" maxOccurs="1" /> 
    </xs:sequence> 
</xs:complexType> 
<!-- Use the type (note the "this:" prefix) --> 
<xs:element name="Row" type="this:Row" minOccurs="0" maxOccurs="unbounded" /> 
2

失敗的另一點這裏是Windows 7的「堵」模式文件......在磁盤上的XSD文件,屬性>常規右鍵單擊,如果它阻止,你就會有一個「解除阻止」按鈕。這導致我的XML驗證在VS2012中失敗。