簡體   English   中英

我可以根據 XML 模式驗證 XPath 表達式嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM