我會創建另一個包含規則集的XML。
在規則中,如果您只需要確保層次結構有效並且必須包含某種數據類型,那麼我會製作一個「規則」XML,它是完全有效的XML的完整層次結構,包含裏面的代碼與每一個可能有效孩子的和屬性,其中也包含了所需的數據類型爲字符串值的所有節點,例如
<age>"int"</age>
,您可以通過層次讀和組成樹狀結構,它可以很容易地驗證層次結構。
如果有更詳細的規則,例如如果某個節點是強制性的,並且如果失蹤則認爲無效,您可以設置一個屬性,如「isMandatory」,在構建樹時可以讀取該屬性,並執行檢查某個XML節點是否包含強制子節點!
這將是一個動態的方法,因爲您所要做的只是編輯規則XML,並且您的代碼可以完美擴展以適應未來的規則。
我以前親自使用過這個方法,當我需要確保層次結構正確並且節點包含正確的屬性時,除非看到您有大量規則,否則您可能需要不同的結構。
編輯: 我會使用DOM解析器來解析XML。 DOM解析模型被認爲是內存效率低下的問題,但對於您的情況而言,在執行方面將非常有效。 http://howtodoinjava.com/2014/07/31/java-xml-dom-parser-example-tutorial/#parse_known_xml 您可以在Oracle網站上閱讀更多關於DOM解析器API的信息。
其次,您可以根據自己的設置驗證方法來獲得創意。這可以用於你的例子非常簡單的驗證XML是:
進行驗證
<DATA>
<Parent isRequired="true">
<Fields>
<Name isRequired="true">
<Type>string</Type>
</Name>
<Age isRequired="false">
//Cannot have more than one age field
<Rules>
<MaxCount>1</MaxCount>
</Rules>
</Age>
// etc etc for other fields
<Rules>
//Having name and an age throws error
<Rule>Name + Age</Rule>
//Throw error if there is a height element together with an age or a bloodtype
<Rule>(Age | Bloodtype) + Height</Rule>
</Rules>
</Fields>
</Parent>
</DATA>
方法是從(規則XML)根節點開始,並期待所有的孩子的。確保數據XML中存在所有強制節點。確保所有葉節點數據類型都正確。
將所有節點解析爲一個字符串,並以類似的方式解決帶註釋的int表達式,確保孩子遵循規則表達式。
您不需要使用相同的示例格式,和+。要富有創造性,弄清楚什麼「規則表達」最適合你:)
整體來說,你可能有很多不同的「規則類型」規則。例如,一個規則可能需要一個必須擁有的節點,而一個規則可能確保某個節點不存在(如果另一個節點不存在),並且一個規則可能是某個節點不能存在多次。 爲了支持如此多的不同類型,如果驗證,結構可能最終變得複雜,但如果您需要真正的動態規則(最終也可以重複使用),那麼肯定會付出努力。
來源
2015-03-25 05:08:03
JTY
感謝您的回覆。當前的規則被列爲「如果節點1 = xyz並且節點2 = lmn然後拋出錯誤(節點1和2是在Excel中的標籤名稱)」,在某些情況下它可以具有5個不同的元素和/或條件。目前我有三個問題1.如何將規則存儲在xml文件中,我的意思是結構2.如何解析xml(源)3.如何將規則轉換爲xml標籤名稱,因爲UI字段名稱和xml標籤名字是不同的 – 2015-03-25 08:37:38
@DougParker看看編輯過的答案,看它是否回答你的問題。 – JTY 2015-03-25 09:46:39