1

xmlドキュメントにスキーマが含まれている場合にxmlスキーマに対してxmlファイルを検証する際に問題が発生します。xmlファイルは次のようになります。

<?xml version="1.0"?>
<catalog xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
         xmlns:x="urn:book"> 
<!-- START OF SCHEMA -->
<xsd:schema targetNamespace="urn:book">
 <xsd:element name="book">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="author" type="xsd:string"/>
      <xsd:element name="title" type="xsd:string"/>
      <xsd:element name="genre" type="xsd:string"/>
      <xsd:element name="price" type="xsd:float"/>
      <xsd:element name="publish_date" type="xsd:date"/>
      <xsd:element name="description" type="xsd:string"/>
    </xsd:sequence>
    <xsd:attribute name="id" type="xsd:string"/>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>
<!-- END OF SCHEMA -->
   <x:book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications with
      XML.</description>
   </x:book>
</catalog>

Javaコードは次のようになります。

// define the type of schema - we use W3C:
String schemaLang = "http://www.w3.org/2001/XMLSchema";

// get validation driver:
SchemaFactory factory = SchemaFactory.newInstance(schemaLang);

// create schema by reading it from an XSD file:
Schema schema = factory.newSchema(new StreamSource("..........."));
Validator validator = schema.newValidator();

// at last perform validation:
validator.validate(new StreamSource("myDoc.xml"));

そして私にとっての問題は、この場合、SchemaFactoryオブジェクトをどのように使用するかです。

私はどんな助けにも大いに感謝しています!

4

2 に答える 2

2

私はこれがあなたが望むものだと思います。このコードは、優れたプログラミング手法を説明するものではなく、説明するためのものです。XMLでテストされました。主な前提は、ドキュメント要素に2つの要素があり、1つはXSD、2つ目は検証するXMLであるということです。

たとえば、44.95をd44.95に変更すると、次の出力が得られます。

cvc-datatype-valid.1.2.1:'d44.95'は'float'の有効な値ではないため、XMLは無効です。

それ以外の場合は、すべてが正常に実行され、プログラムはXMLを出力します。

import java.io.*;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.validation.*;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
import javax.xml.xpath.*;
import org.xml.sax.InputSource;

public class TestValidation {
    public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException, XPathExpressionException {
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList nodes = (NodeList)xpath.evaluate("/*/*", new InputSource("XmlWithEmbeddedXsd.xml"), XPathConstants.NODESET);
        SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        Validator validator = factory.newSchema(new DOMSource(nodes.item(0))).newValidator();
        try {
            validator.validate(new DOMSource(nodes.item(1)));
            System.out.println("XML is valid.");
        }
        catch (SAXException ex) {
            System.out.println("XML is not valid because " + ex.getMessage());
        }
    }
}
于 2012-02-02T02:03:10.723 に答える
0

Gardeaのソリューション(DOMの使用を伴うものに嫌悪感があることを除けば問題ありません)の代わりに、スキーマとブック要素を別々のドキュメントとして抽出してから、一方を他方に対して検証する変換を行うことができます。検証前の変換は十分に活用されていないデザインパターンであるため、これについて言及します。

于 2012-02-02T08:42:33.277 に答える