目錄
問題內容
解決方法
首頁 Java 使用作為檔案載入的 XSD 進行 XML 驗證與輸入流

使用作為檔案載入的 XSD 進行 XML 驗證與輸入流

Feb 09, 2024 pm 03:09 PM

在php小編草莓的指導下,我們將探討使用作為檔案載入的XSD進行XML驗證與輸入流程的方法。當我們處理XML資料時,驗證是非常重要的一步,以確保資料的正確性和完整性。透過使用XSD(XML Schema Definition)文件,我們可以定義XML文件的結構和約束。透過載入XSD檔案並將其用於驗證輸入的XML流,我們可以輕鬆地偵測和處理不符合規定的數據,從而提高應用程式的可靠性和安全性。接下來,我們將詳細介紹如何使用XSD檔案進行XML驗證和輸入流處理。

問題內容

如果 xsd 作為檔案或資源加載,我在 xml 驗證中會遇到不同的行為。

如果我將 xsd 作為文件加載,一切都很好並且驗證工作正常:

schemafactory sf = schemafactory.newinstance(xmlconstants.w3c_xml_schema_ns_uri);
schema schema = sf.newschema(new classpathresource("my/perfect/path/myfile.xsd").getfile());
validator validator = schema.newvalidator();
validator.validate(sourcetovalidate);
登入後複製

相反,因為我決定將xsd 檔案包含到jar 中,所以我將其作為資源加載,但行為不同,當我構造架構時,我陷入saxparseexception ,並且錯誤抱怨中的某有些問題將xsd 檔案中的名稱解析為型別定義。 xsd 檔案絕對正確

SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("my/perfect/path/myFile.xsd");
Source schemaSource = new StreamSource(inputStream);
Schema schema = sf.newSchema(schemaSource); // here i get the SAXParseException
Validator validator = schema.newValidator();
validator.validate(sourceToValidate);
登入後複製

我真的不明白為什麼載入 xsd 作為 resourceasstream 會導致不同的行為

我使用 jaxb 進行 xml 驗證

解決方法

我猜您的 xsd 引用了其他 xsd,並且您的驗證器不知道如何解析這些引用。

您可能需要提供 lsresourceresolvervalidator

#
classloader loader = getclass().getclassloader();
lsresourceresolver resolver = new lsresourceresolver() {
   public lsinput resolveresource(string type, string namespaceuri, string publicid, string systemid, string baseuri) {
      inputstream stream = loader.getresourceasstream(systemid);
      if (stream == null) throw new runtimeexception("could not find " + systemid);
      lsinput input = new dominputimpl();
      input.setpublicid(publicid);
      input.setsystemid(systemid);
      input.setbaseuri(baseuri);
      input.setbytestream(stream);             
      return input;
   }
};
validator validator = schema.newvalidator();
validator.setresourceresolver(resolver);
登入後複製

您還需要透過呼叫 streamsource 的兩個參數建構子來在 inputsource 上設定 systemid

String xsdPath = "my/perfect/path/myFile.xsd";
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(xsdPath);
Source schemaSource = new StreamSource(inputStream, xsdPath);
登入後複製

請參考streamsource(inputstream, string)

#

以上是使用作為檔案載入的 XSD 進行 XML 驗證與輸入流的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1667
14
CakePHP 教程
1426
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1255
24