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

Pengesahan XML dan penstriman input menggunakan XSD dimuatkan sebagai fail

WBOY
WBOYke hadapan
2024-02-09 15:09:091000semak imbas

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);

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);

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);

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);

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam