簡體   English   中英

如何在XML中獲取不區分大小寫的元素

[英]How to get case-insensitive elements in XML

據我所知,XML元素類型名稱以及屬性名稱區分大小寫。

有沒有辦法或任何技巧來獲得不區分大小寫的元素?

澄清 :已經通過XSD定義了語法,該語法用於某些客戶端上傳數據。 用戶 - 內容生成器 - 使用不同的工具創建XML文件,但其中許多使用純文本編輯器或其他任何工具。 有時當這些人試圖上傳他們的文件時,會出現不兼容錯誤。 混合lowerCase和upperCase標簽是一個常見的錯誤,盡管標簽總是很敏感。

我可以訪問定義此語法的XSD文件,我可以更改它。 問題是如何避免這種容易出錯的大/小寫標簽問題。

任何的想法?

提前致謝!

如果我正確理解您的問題,則只能在創建和第三方解析工具上傳之間糾正案例錯誤。

即XML文件>解析XSD並更正>上傳已批准

您可以在運行時通過為客戶端開發容器應用程序來創建XML文件來執行此操作。或者,您可以在服務器端編寫一個應用程序來獲取上載的文件並檢查語法。 無論哪種方式,你將不得不做出決定,然后做一些工作!

很大程度上取決於問題的規模。 如果您在XSD中的不同情況下有相似的標簽,但是您正在接收,那么您需要一個基於節點計數等的復雜解決方案。

如果您完全堅持使用針對僅包含小寫標簽的XSD的隨機案例,那么您應該能夠解析文件並將所有標簽一次性轉換為小寫。 這假設標簽之間的內容是多個案例,您不能只轉換完整的文檔。

你如何做到這一點取決於你的情況的機制。 顯然,讓客戶錯誤檢查他們自己的提交會更容易。 如果這不實用,那么您需要在流程中確定一個機會窗口,這樣您就可以在遇到錯誤之前將文件轉換為正確的格式。

這里有很多方法可以討論這個問題。 它主要取決於您可以使用的技能組合或財務。

理論上,您可以嘗試破解XML Schema以驗證錯誤的大寫元素名稱。

這可以通過使用XML Schema中的替換組機制來完成。 例如,如果您的架構已定義:

  <xsd:element name="foobar" type="xsd:string"/>

然后你可以將以下內容添加到XML Schema:

  <xsd:element name="Foobar" type="xsd:string" substitutionGroup="foobar"/>
  <xsd:element name="FooBar" type="xsd:string" substitutionGroup="foobar"/>
  <xsd:element name="fooBar" type="xsd:string" substitutionGroup="foobar"/>
  <xsd:element name="FOOBAR" type="xsd:string" substitutionGroup="foobar"/>

等等

試圖預測他們可能犯的錯誤。 對於每個元素,可能存在2 ^ n個可能的情況組合,其中n是名稱的長度(假設名稱的每個字符是字母)。

在實踐中,這太麻煩了,只能延遲問題而不是解決問題,而且可能無法正常工作。 如果用戶沒有意識到XML區分大小寫,那么他們可能沒有與開始標記的情況匹配的結束標記,並且仍然無法驗證。

正如其他人所說,要么預先處理提交的輸入以修復案例,要么讓用戶在提交之前產生正確的輸入。

XPath / Xslt處理器區分大小寫。 如果指定了錯誤的大小寫,則無法選擇節點/屬性。

如果您想輸出節點名稱並希望它是大寫的,您可以執行以下操作:

upper-case(local-name())

正如@Melkisadek所說,XSD驗證存在於一個目的。 如果允許用戶上載包含無效XML的文件,則在訪問這些文件中的數據時,您的應用程序必然會失敗。 此外,使用XSD驗證輸入XML模式的整個目的都被打敗了。 如果您願意放棄整個架構驗證功能,那么您需要使用XSLT將所有標簽轉換為大寫或小寫(請參閱@ Rashmi的答案)。

這類似於允許用戶在社會安全號碼輸入字段中輸入特殊字符,僅僅因為用戶更容易輸入特殊字符(是的,這個例子很傻,想不到更好的字符!)

因此,在我看來,解決方案在於保持架構驗證不變,但為用戶提供在上載之前驗證架構的方法。 例如,如果這是Web應用程序,您可以在頁面上提供一個按鈕,該按鈕使用Javascript根據您的架構驗證文件。 或者,僅在上載文件時在服務器上進行驗證。 在這兩種情況下,都要提供適當的反饋,例如錯誤實體所在的行號,字符位置以及標記錯誤的原因。

從用戶加載xml時,簡單解決方案是發送到小寫的所有標記/屬性,然后通過為所有小寫標記/屬性設計的xsd進行檢查

XML通常是機器生成的。 因此,這里你應該沒有真正的問題width <RANdOm /> case。

如果真正的問題是兩個不同的系統正在生成兩種不同類型的標簽( <Widget /> vs. <widget /> ),我想你可以簡單地在XSD中定義兩種情況。

上傳后,瀏覽XML文件(通過DOM或SAX)並在驗證之前修復外殼?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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