Проверка xml на файл xsd, сгенерированный с помощью JAXB и опции сборки XSD в eclipse - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь получить пример кода для проверки моего xml-файла по сравнению с файлом xsd, который генерируется с помощью сборки jaxb и xsd через Eclipse.

Я пытаюсь создать пример файла валидатора, который проверяетмой xml против моего файла xsd.Теперь я нашел много примеров для кода Java, и я использую один из них.Также я получил много ответов на проблему, с которой я столкнулся, но каким-то образом ответы предлагают обновить мой xsd или xml файл.Для меня я не могу сделать ничего из этого, так как я генерирую файлы xsd через опцию сборки jaxb и xsd через Eclipse.

try {
SchemaFactory factory = 
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new File(xsdPath));
Validator validator = schema.newValidator();
validator.validate(new StreamSource(new File(xmlPath)));
} catch (IOException e) {
System.out.println("Exception: "+e.getMessage());
return false;
} catch( SAXException e){
System.out.println("Exception: "+e.getMessage());
return false;
}
return true;
}

My XML File
<!DOCTYPE MLIspec SYSTEM "MLIspec-1.6.dtd"> 
<MLIspec> 
<id>4050response</id> 
<typename>4050Response</typename> 
<description>Show the Contract Numbers</description>    
<element> 
<id>7504</id> 
<name>SourceAccountIdentifier</name> 
<type>table</type> 
<required>true</required>       
</element>
</MLIspec>
XSD file

<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cdcla="cdcla" jxb:version="1.0">
<xs:include schemaLocation="SourceAccountIdentifier.xsd"/>
<xs:complexType name="MXMLI4050Response">
<xs:annotation>
<xs:appinfo>
<jxb:class name="MXMLI4050Response">
<jxb:javadoc>4050response - MXMLI4050Response. Show the Contract Numbers. </jxb:javadoc>
</jxb:class>
<cdcla:elf group="true"/>
</xs:appinfo>
</xs:annotation>
<xs:all>
<xs:element name="e7920" type="xs:integer" minOccurs="0">
<xs:annotation>
<xs:documentation>MessageFunctionCode</xs:documentation>
<xs:appinfo>
<jxb:property name="MessageFunctionCode">
<jxb:javadoc>7920 - MessageFunctionCode. </jxb:javadoc>
<jxb:baseType>
<jxb:javaType name="java.lang.Integer" parseMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.parseIntegerFromDatatypeN" printMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.printIntegerAsDatatypeN"/>
</jxb:baseType>
</jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="e8002" type="xs:integer" minOccurs="0">
<xs:annotation>
<xs:documentation>TerminalID</xs:documentation>
<xs:appinfo>
<jxb:property name="TerminalID">
<jxb:javadoc>8002 - TerminalID. </jxb:javadoc>
<jxb:baseType>
<jxb:javaType name="java.lang.Integer" parseMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.parseIntegerFromDatatypeN" printMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.printIntegerAsDatatypeN"/>
</jxb:baseType>
</jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="e8005" type="xs:integer" minOccurs="0">
<xs:annotation>
<xs:documentation>MessageSequenceNumber</xs:documentation>
<xs:appinfo>
<jxb:property name="MessageSequenceNumber">
<jxb:javadoc>8005 - MessageSequenceNumber. </jxb:javadoc>
<jxb:baseType>
<jxb:javaType name="java.lang.Integer" parseMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.parseIntegerFromDatatypeN" printMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.printIntegerAsDatatypeN"/>
</jxb:baseType>
</jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="e7300" type="xs:integer" minOccurs="0">
<xs:annotation>
<xs:documentation>AcquirerResponseCode</xs:documentation>
<xs:appinfo>
<jxb:property name="AcquirerResponseCode">
<jxb:javadoc>7300 - AcquirerResponseCode. </jxb:javadoc>
<jxb:baseType>
<jxb:javaType name="java.lang.Integer" parseMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.parseIntegerFromDatatypeN" printMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.printIntegerAsDatatypeN"/>
</jxb:baseType>
</jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="e7302" type="xs:integer" minOccurs="0">
<xs:annotation>
<xs:documentation>ActionCode</xs:documentation>
<xs:appinfo>
<jxb:property name="ActionCode">
<jxb:javadoc>7302 - ActionCode. </jxb:javadoc>
<jxb:baseType>
<jxb:javaType name="java.lang.Integer" parseMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.parseIntegerFromDatatypeN" printMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.printIntegerAsDatatypeN"/>
</jxb:baseType>
</jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="e40986" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>ActionCodeDescription</xs:documentation>
<xs:appinfo>
<jxb:property name="ActionCodeDescription">
<jxb:javadoc>40986 - ActionCodeDescription. </jxb:javadoc>
</jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="e7928" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>HostID</xs:documentation>
<xs:appinfo>
<jxb:property name="HostID">
<jxb:javadoc>7928 - HostID. </jxb:javadoc>
</jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="e8001" type="xs:integer" minOccurs="0">
<xs:annotation>
<xs:documentation>RetryFlag</xs:documentation>
<xs:appinfo>
<jxb:property name="RetryFlag">
<jxb:javadoc>8001 - RetryFlag. </jxb:javadoc>
<jxb:baseType>
<jxb:javaType name="java.lang.Integer" parseMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.parseIntegerFromDatatypeN" printMethod="com.citigroup.cdcla.gmli.bind.DatatypeConverter.printIntegerAsDatatypeN"/>
</jxb:baseType>
</jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="e47602" type="xs:integer" minOccurs="0">
<xs:annotation>
<xs:documentation>CustomerTypeCode</xs:documentation>
<xs:appinfo>
<jxb:property name="CustomerTypeCode">
<jxb:javadoc>47602 - CustomerTypeCode. </jxb:javadoc>
</jxb:property>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="e7504" type="SourceAccountIdentifier" maxOccurs="unbounded" minOccurs="0">
<xs:annotation>
<xs:documentation>SourceAccountIdentifierList</xs:documentation>
<xs:appinfo>
<jxb:property name="SourceAccountIdentifierList">
<jxb:javadoc>7504 - SourceAccountIdentifier Table. </jxb:javadoc>
</jxb:property>
<cdcla:elf group="true"/>
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:schema>

Ниже приведена ошибка, которую я получаю Исключение: src-resol: Cannotразрешить имя 'SourceAccountIdentifier' для (n) компонента "определение типа".

Кроме того, я попытался удалить SourceAccountIdentifier из моего определения xsd, чтобы проверить, не происходит ли его где-либо еще, в этом случае я получаюниже ошибка

Exception: src\main\java\com\citi\cbol\test\MLIspec-1.6.dtd (The system cannot find the file specified)

Пожалуйста, помогите найти решение этой ошибки.Спасибо !!

1 Ответ

0 голосов
/ 13 января 2019

Сгенерированный код для вас github .

Я gussing , что проблема с xml илиxsd файлов - но я точно не знаю.

Я сейчас удалил dtd, вот что у меня есть:

thufir@dur:~/xml/so$ 
thufir@dur:~/xml/so$ ls
foo.xml
thufir@dur:~/xml/so$ 
thufir@dur:~/xml/so$ cat foo.xml 
<MLIspec> 
<id>4050response</id> 
<typename>4050Response</typename> 
<description>Show the Contract Numbers</description>    
<element> 
<id>7504</id> 
<name>SourceAccountIdentifier</name> 
<type>table</type> 
<required>true</required>       
</element>
</MLIspec>
thufir@dur:~/xml/so$ 
thufir@dur:~/xml/so$ trang foo.xml foo.xsd
thufir@dur:~/xml/so$ 
thufir@dur:~/xml/so$ cat foo.xsd 
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="MLIspec">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="id"/>
        <xs:element ref="typename"/>
        <xs:element ref="description"/>
        <xs:element ref="element"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="typename" type="xs:NMTOKEN"/>
  <xs:element name="description" type="xs:string"/>
  <xs:element name="element">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="id"/>
        <xs:element ref="name"/>
        <xs:element ref="type"/>
        <xs:element ref="required"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="name" type="xs:NCName"/>
  <xs:element name="type" type="xs:NCName"/>
  <xs:element name="required" type="xs:boolean"/>
  <xs:element name="id" type="xs:NMTOKEN"/>
</xs:schema>
thufir@dur:~/xml/so$ 
thufir@dur:~/xml/so$ xjc foo.xsd 
parsing a schema...
compiling a schema...
generated/Element.java
generated/MLIspec.java
generated/ObjectFactory.java
thufir@dur:~/xml/so$ 
thufir@dur:~/xml/so$ tree
.
├── foo.xml
├── foo.xsd
└── generated
    ├── Element.java
    ├── MLIspec.java
    └── ObjectFactory.java

1 directory, 5 files
thufir@dur:~/xml/so$ 

Это инструменты trang и xjc, которые достаточно легко устанавливаются в Ubuntu Linux. Вот как запустить проект, который собирается из консоли:

thufir@dur:~/NetBeansProjects$ 
thufir@dur:~/NetBeansProjects$ cat /home/thufir/xml/output.xml 
cat: /home/thufir/xml/output.xml: No such file or directory
thufir@dur:~/NetBeansProjects$ 
thufir@dur:~/NetBeansProjects$ git clone git@github.com:THUFIR/xjc_generated-code.git
Cloning into 'xjc_generated-code'...
remote: Enumerating objects: 143, done.
remote: Counting objects: 100% (143/143), done.
remote: Compressing objects: 100% (81/81), done.
remote: Total 143 (delta 25), reused 120 (delta 11), pack-reused 0
Receiving objects: 100% (143/143), 79.43 KiB | 191.00 KiB/s, done.
Resolving deltas: 100% (25/25), done.
thufir@dur:~/NetBeansProjects$ 
thufir@dur:~/NetBeansProjects$ cd xjc_generated-code/
thufir@dur:~/NetBeansProjects/xjc_generated-code$ 
thufir@dur:~/NetBeansProjects/xjc_generated-code$ gradle clean run

> Task :run
Jan 17, 2019 2:34:06 PM xjc_generated.code.driver.App unmarshallMLI
INFO: generated.MLIspec@12edcd21

BUILD SUCCESSFUL in 1s
4 actionable tasks: 3 executed, 1 up-to-date
thufir@dur:~/NetBeansProjects/xjc_generated-code$ 
thufir@dur:~/NetBeansProjects/xjc_generated-code$ cat /home/thufir/xml/output.xml 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MLIspec>
    <id>4050response</id>
    <typename>4050Response</typename>
    <description>Show the Contract Numbers</description>
    <element>
        <id>7504</id>
        <name>SourceAccountIdentifier</name>
        <type>table</type>
        <required>true</required>
    </element>
</MLIspec>
thufir@dur:~/NetBeansProjects/xjc_generated-code$ 

Это должно работать даже из Eclipse.Обратите внимание, что он использует gradle или Gradle Kotlin DSL для файла сборки, который Eclipse должен уметь обрабатывать.Возможно, вы хотите импортировать как простой проект.

Вам нужно всего лишь изменить файл properties.xml для вашей системы ;исходный код должен быть в порядке.

...