2008-09-30 41 views
2

有沒有辦法獲得更多有用的驗證錯誤信息? XmlSchemaException提供錯誤的行號和位置,這對我來說毫無意義。畢竟Xml文檔並不是關於它的短暫文本表示。我想獲得枚舉錯誤(或錯誤代碼),指定什麼時候錯誤,節點名稱(或xpath)來定位問題的來源,以便我可以嘗試修復它。驗證和修復xml

編輯:我在談論有效的XML文件 - 只是無效的特定架構!

回答

0

您可以通過設置XmlReader的XmlReaderSettings包含架構,然後使用它逐個讀取節點輸入流來完成此操作。您可以跟蹤最後讀取的節點,並在出現驗證錯誤時對文檔的位置有一個很好的瞭解。

我認爲如果你嘗試這個練習,你會發現錯誤節點的概念沒有太大意義的地方有很多驗證錯誤(例如缺少必要的元素)。是的,父元素在這種情況下顯然是錯誤的,但真正引發錯誤的是讀者遇到結束標籤而沒有看到所需的元素,這就是爲什麼錯誤行和位置指向結束標籤的原因。

0

個人我不確定如何獲得更詳細的錯誤,典型地如果您打開文檔並轉到提到的位置,您可以輕鬆找到錯誤。

如果代碼無法將文件解析爲有效的XML,那麼它很難給出XPATH或其他命名的XML細節。

2

以我的經驗,你很幸運能得到一個行號和解析位置。

1

您可能會考慮通過DTD進行驗證,但可以使用有時給出稍微有趣的錯誤,但是,在我目前正在使用的項目中,我們使用XSLT進行了驗證。變換檢查語法並將錯誤報告爲輸出的變換文本。如果你想更友好的錯誤檢查,我會考慮這條路線。對於我們來說,空輸出意味着沒有錯誤,否則我們會從XSLT處理錯誤和錯誤的地方得到一些很好的細節。

+0

謝謝!你在談論類似於schematron的東西。我目前正在做同樣的事情,但它不能幫助我嘗試在運行時修復有問題的xml文檔。 – Goran 2008-09-30 20:58:44

+0

如果您編寫自己的XSLT,您將有更好的修復運氣。我們的XSLT有兩個方面:一個用於語法,另一個用於驗證(我們的XML就像是腳本)。這兩個部分都提供了有意義的信息,可以用於某些部分重建破碎的信息。 – 2008-09-30 21:26:47

0

看來這不是一件容易的事。羅伯特羅斯尼的答案最接近於解決我的問題的程序,所以我現在就接受。我將繼續使用xsl解決方案。任何人找到解決驗證錯誤的更好方法都可以響應此線程。