Rumah > Java > Pengesahan XML dan penstriman input menggunakan XSD dimuatkan sebagai fail

Pengesahan XML dan penstriman input menggunakan XSD dimuatkan sebagai fail

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2024-02-09 15:09:09
ke hadapan
1122 orang telah melayarinya

Di bawah bimbingan editor PHP Strawberry, kami akan meneroka kaedah pengesahan XML dan penstriman input menggunakan XSD dimuatkan sebagai fail. Apabila kami berurusan dengan data XML, pengesahan adalah langkah yang sangat penting untuk memastikan ketepatan dan kesempurnaan data. Dengan menggunakan fail XSD (XML Schema Definition), kami boleh menentukan struktur dan kekangan dokumen XML. Dengan memuatkan fail XSD dan menggunakannya untuk mengesahkan aliran XML yang masuk, kami boleh mengesan dan mengendalikan data tidak mematuhi dengan mudah, dengan itu meningkatkan kebolehpercayaan dan keselamatan aplikasi kami. Seterusnya, kami akan memperincikan cara menggunakan fail XSD untuk pengesahan XML dan pemprosesan aliran input.

Kandungan soalan

Saya mengalami tingkah laku yang berbeza dalam pengesahan xml jika xsd dimuatkan sebagai fail atau sumber.

Jika saya memuatkan xsd sebagai fail, semuanya baik dan pengesahan berfungsi dengan baik:

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);
Salin selepas log masuk

Sebaliknya, kerana saya memutuskan untuk memasukkan fail xsd ke dalam balang, saya memuatkannya sebagai sumber, tetapi kelakuannya berbeza, apabila saya membina skema, saya terperangkap dalam saxparseexception dan ralat mengadu tentang beberapa isu dalam fail xsd Nama diselesaikan kepada definisi jenis. Fail xsd betul betul

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);
Salin selepas log masuk

Saya benar-benar tidak faham mengapa memuatkan xsd sebagai resourceasstream menghasilkan tingkah laku yang berbeza

Saya menggunakan jaxb untuk pengesahan xml

Penyelesaian

Tekaan saya ialah xsd anda merujuk kepada xsd lain, dan pengesah anda tidak tahu cara menyelesaikan rujukan tersebut.

Anda mungkin perlu menyediakan lsresourceresolver kepada validator

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);
Salin selepas log masuk

Anda juga perlu menghubungi streamsource 的两个参数构造函数来在 inputsource 上设置 systemid.

String xsdPath = "my/perfect/path/myFile.xsd";
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(xsdPath);
Source schemaSource = new StreamSource(inputStream, xsdPath);
Salin selepas log masuk

Lihat sumber aliran(strim masukan, rentetan)

Atas ialah kandungan terperinci Pengesahan XML dan penstriman input menggunakan XSD dimuatkan sebagai fail. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan