[英]Can I validate an XPath expression against an XML schema?
您可以根據 XML 文檔驗證 XPath 表達式來驗證它,但是是否有一種簡單的方法可以根據該文檔的架構驗證相同的 XPath 表達式?
假設我有一個像這樣的 XSD 架構:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... etc>
<xsd:element name="RootData">
<xsd:complexType>
<xsd:sequence minOccurs="0">
<xsd:element name="FirstChild">
<xsd:complexType>
<xsd:sequence minOccurs="0">
<xsd:element name="FirstGrandChild">
... etc etc
是否有一種簡單或內置的方法來驗證 XPath:
/RootData/FirstChild/FirstGrandChild
對可能基於該模式的任何 XML 文檔是否有效? (編輯:我想我的意思是可能有效;實際的 XML 文檔可能不包含這些元素,但是 XPath 仍然可以被認為對架構可能有效。而例如/RootData/ClearlyInvalidChild/ThisElementDoesntExistEither
顯然是無效的。)
當然,我只能期望這適用於規范的 XPath 表達式,而不是任意復雜的表達式,但這很好。
我特別想在 .NET 但很好奇其他實現是否可以實現。 我想自己動手並不那么重要,例如,我真的不想編寫自己的代碼來將 XPath 表達式轉換為另一個表達式,例如:
/xsd:schema/xsd:element[@name='RootData']/xsd:complexType/xsd:sequence/xsd:element[@name='FirstChild']/...etc...
......雖然我知道如果我真的必須這樣做,我可以這樣做。
干杯!
實際上,我們對此進行了一個研究項目,並在 2000 年左右的某個時候實施了 XPath 驗證程序。這是針對 XPath 1 的。我不知道您可以使用任何當前可用的庫來執行此操作。
如果你想 go 並自己實現,這里有一些提示:
您將無法像上面那樣將實例文檔上的路徑轉換為架構上的路徑。 例如, /a//b
不會轉換為/xsd:element[@name='a']//xsd:element[@name='b']
因為元素 b 可能定義在架構的頂層,不在 b 之下。
請記住,雖然 XML 文檔是樹,但模式是圖。 如果你搜索像 //a 這樣的后代路徑,你將不得不決定何時終止搜索,否則它可能會永遠繼續下去(例如,想象一個包含“b”的元素“a”,其中包含“a”)
有些路徑將無法確定或至少很難確定。 例如//*[starts-with(@name, 'foo')]
如果您仍然願意,我建議使用 eclipse 的XSD或 .NET 模式加載類之類的庫將模式加載到 memory 中並檢查代碼。
在設計時,您可以使用工具生成示例 XML 文檔並針對示例執行 XPath。 Altova XML Spy 具有此功能,SOAP UI 也是如此。
SOAP UI 實際上是開源的 (Java),所以也許你可以看看它是如何生成示例的。 在運行時情況下(即如果模式和 XPath 都是運行程序的輸入),那么您必須確保生成了足夠的可選組件和示例數據以避免誤報,並且可能需要生成多個示例文件。
我不會嘗試直接針對架構評估 XPath,因為各種軸會使完整的解決方案變得非常復雜。 我很確定這是可以做到的,但它給我的印象是核心數學。 我建議生成樣本作為捷徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.