2009-04-30 37 views
5

我想知道解決此問題的最佳方法: 我想從xml模式創建一個空白模板xml。所有必需的元素和屬性將被創建,它們的值將全部爲空字符串。從.NET中的xsd創建一個xml文件

下一步是如何確定某個節點可能具有哪些子xml節點。例如。我會選擇一個節點有一個子節點minOccurs =「0」,maxOccurs =「unbounded」。我將能夠確定有關該孩子的所有信息,其屬性,名稱,數值類型等。

爲了給出更多關於情況的上下文,我正在研究一種工具,該工具允許用戶編輯xml文件更多用戶友好的設置。例如,他們可以添加一個新賬戶到'賬戶數據庫'節點,他們會看到唯一可用的節點是一個賬戶節點。接下來,當他們嘗試將子節點添加到帳戶節點時,選項將是名稱節點(必需),密碼節點(必需),設置節點(可選)等。如何以編程方式確定帳戶節點可用於它以及這些孩子的屬性和設置是什麼?

這是C#2.0與.NET 2.0。

總之,我使用哪些類來讀取模式並解析它以獲取創建xml的有用信息?在我的天真中,我希望由於xsd本身就是xml,所以會有某種我可以穿過的DOM模型。

我想這是僅限於我的程序,所以沒有使用外部工具,如OxygenXml,VS,XSD.EXE等

+1

可能的重複[是否有一個類從.NET中的XSD架構生成示例XML文檔](http://stackoverflow.com/questions/41674/is-there-a-class-to-generate-a -sample-xml-document-from-xsd-schema-in-net) – 2010-05-19 01:23:54

回答

1

這聽起來像你想要做的是在大多數好的XML編輯器中複製XML intellisense的功能。即讀取一個xml模式並找出下一個元素和屬性。

我們在一段時間以前的項目上做了非常類似的事情。生產大多數時間工作的東西是很多工作,爲了生產一直在工作的東西,需要大量的工作!

基本上你需要加載XSD(在.net中的XmlSchema對象允許你這樣做)。但是他們揭示的SOM對象模型非常原始,所以你需要做很多工作來解釋它。如果您忽略諸如替換組,complexType擴展,變色龍模式和名稱空間等概念,則應該能夠合理輕鬆地導航SOM。

您接下來需要弄清楚您在與您的模式相關的XML文檔中的位置。一旦你知道你是在SOM中,你就可以開始制定可用的選項。

正確地做到這一點是1,000'的代碼行和4-12周的工作。你可能能夠在幾周內得到一些基本的東西?

+0

是的,這就是我在開始工作時所發現的。爲此創建一個庫確實需要幾個小時。我已經辭去了通過XmlSchema對象的遍歷,並選擇並拉取了我現在需要的信息。 – ipwnponies 2009-05-03 03:44:26

0

你可以使用第三方工具,如XMLSPY(link)。它會從xsd中創建一個虛擬的xml,反之亦然。

一個真正環島(但免費)的方式,你可以用你的機器上存在的.NET工具做的是使用XSD.EXE(link)來生成實體對象,你的架構定義使用下列內容:

xsd /classes /language:CS XSDSchemaFile.xsd 

然後當你有對象時,將它們加載到一個項目中並對它們進行序列化。如果你想添加一些虛擬數據,你可以填充屬性等。

+0

對不起,我沒有指出這一點,我希望這完全在我的程序內完成。我想要的最重要的信息是一種方法或類,它允許我爲我需要的任何信息解析模式。 – ipwnponies 2009-04-30 20:11:53

1

我一直在用MSDN文檔流血我的眼睛,我想我已經拿起了一種氣味。 使用XmlSchema.Read加載模式並對其進行編譯。 Elements屬性將包含「頂級」元素的集合。您必須硬編碼根元素的限定名稱或其他內容。就是這樣。我還沒有找到如何在給定的模式元素下找到'內容'。

編輯:我發現了一些更多的路要走,但它仍然不是很清楚。 XmlSchemaElements具有模式類型屬性。這不是簡單就是複雜。 xml模式中的複雜類型可以具有屬性,序列,組等。該序列具有稱爲粒子的屬性,該屬性可以是一個元素。循環重複。但我認爲實現中的難點在於確保覆蓋所有可能的情況(簡單類型,具有屬性的複雜類型,具有屬性和元素的複雜類型,擴展,整個shebang)。

編輯:使用XmlSchema對象的Element屬性來獲取XmlSchemaElement。使用XmlSchemaElement的SchemaType屬性來獲取簡單或複雜的類型。使用XmlSchemaComplexType的屬性屬性獲取屬性或ContentModel以獲得'簡單內容'/'複雜內容'或粒子以獲得'序列'/'選擇'/'全部'。基本上有很多向下傳遞屬性,檢查類型和左右鑄造對象,並檢查所有可能的xsd對象安排。創建一個庫將是漫長而繁瑣的,並且容易出錯。這是與XML模式,我不想開始思考的dtds。哇,XML模式是必要的,但爲什麼他們必須如此邪惡。