2021年1月27日星期三

How do I use square brackets in ATTLIST enumeration?

I have the following DTD and XML file. When I try to validate the file, I get the following error. The error is occurring on the square bracket in 'byte[]'. How can I include this 'byte[]' in my enumeration? I have tried escaping them with [$#93;, but I get the same error. I tried using quotes around the '"byte[]"' like so, but that didn't work either.

org.xml.sax.SAXParseExceptionpublicId: -//Genera//DTD XML EJB 1.0//EN; systemId: file:///C:/tdc-to-xml/ejb.v2.dtd; lineNumber: 11; columnNumber: 52; The enumerated type list must end with ')' in the "java-type" attribute declaration.

DTD

<!ELEMENT kds-ejb (entities, methods)>  <!ELEMENT entities (entity+)>  <!ELEMENT entity (field+)>  <!ATTLIST entity name CDATA #REQUIRED>  <!ATTLIST entity db-name CDATA #REQUIRED>  <!ATTLIST entity sequence-name CDATA #IMPLIED>  <!ATTLIST entity is-audited (TRUE|FALSE) "FALSE">  <!ELEMENT field (EMPTY)>  <!ATTLIST field name CDATA #REQUIRED>  <!ATTLIST field db-name CDATA #REQUIRED>  <!-- the following line is line 11 -->  <!ATTLIST field java-type (BigDecimal|Boolean|byte[]|Character|Date|Integer|Long|String|Timestamp) #REQUIRED>  <!ATTLIST field is-auto-generated (TRUE|FALSE) "FALSE">  <!ATTLIST field is-audited (TRUE|FALSE) "FALSE">  <!ATTLIST field is-primary-key (TRUE|FALSE) "FALSE">  <!ATTLIST field primary-key-sequence CDATA #IMPLIED>  <!ELEMENT methods (method+)>  <!ELEMENT method (sql, parameters, code?)>  <!ATTLIST method name CDATA #REQUIRED>  <!ATTLIST method entity-name CDATA #IMPLIED>  <!ATTLIST method returns-collection (TRUE|FALSE) "FALSE">  <!ATTLIST method special-return-type CDATA #IMPLIED>  <!ELEMENT sql (#PCDATA)>  <!ELEMENT parameters (parameter)>  <!ELEMENT parameter (EMPTY)>  <!ATTLIST parameter name CDATA #REQUIRED>  <!ATTLIST parameter java-type CDATA #REQUIRED>  <!ATTLIST parameter special-return-type CDATA #IMPLIED>  <!ELEMENT code (line+)>  <!ELEMENT line (text+)>  <!ATTLIST line sequence CDATA #REQUIRED>  <!ELEMENT text (#PCDATA)>  

XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>  <!DOCTYPE kds-ejb PUBLIC "-//Genera//DTD XML EJB 1.0//EN" "ejb.v1.dtd">  <kds-ejb>      <entities>          <entity db-name="tblValidate" name="Validate">              <field db-name="VALIDATE_ID" is-auto-generated="TRUE" is-primary-key="TRUE" java-type="Integer" name="id" primary-key-sequence="0"/>              <field db-name="VALIDATE_TYPE" java-type="String" name="type"/>              <field db-name="VALIDATE_DESCRIPTION" java-type="String" name="description"/>              <field db-name="VALIDATE_ACTIVEYN" java-type="Boolean" name="activeYN"/>              <field db-name="VALIDATE_OLDCODE" java-type="String" name="oldCode"/>              <field db-name="VALIDATE_KEYCODE" java-type="String" name="keyCode"/>          </entity>      </entities>      <methods>          <method entity-name="Validate" name="getValidateByType" returns-collection="TRUE">              <sql>SELECT * FROM TBLVALIDATE WHERE VALIDATE_TYPE = :type ORDER BY VALIDATE_DESCRIPTION</sql>              <parameters>                  <parameter java-type="String" name="oldCode" sequence="0"/>              </parameters>          </method>          <method entity-name="Validate" name="getValidateByOldCode" returns-collection="FALSE">              <sql>SELECT * FROM TBLVALIDATE WHERE VALIDATE_OLDCODE = :oldCode</sql>              <parameters>                  <parameter java-type="String" name="type" sequence="0"/>              </parameters>          </method>      </methods>  </kds-ejb>  

Code to create xml and validate.

public class TdcToXml {  private String fileName = null;    public TdcToXml(String fileName) {      this.fileName = fileName;  }    private void process() {      try {            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();          DocumentBuilder docBuilder = docFactory.newDocumentBuilder();            Document doc = docBuilder.newDocument();          Element rootElement = doc.createElement("kds-ejb");          doc.appendChild(rootElement);            Element entities = doc.createElement("entities");          rootElement.appendChild(entities);            Element entity = doc.createElement("entity");          entity.setAttribute("name", "Validate");          entity.setAttribute("db-name", "tblValidate");          entities.appendChild(entity);            String[][] fields = { { "id", "VALIDATE_ID", "Integer", "TRUE", null, "TRUE", "0" },                  { "type", "VALIDATE_TYPE", "String", null, null, null, null },                  { "description", "VALIDATE_DESCRIPTION", "String", null, null, null, null },                  { "activeYN", "VALIDATE_ACTIVEYN", "Boolean", null, null, null, null },                  { "oldCode", "VALIDATE_OLDCODE", "String", null, null, null, null },                  { "keyCode", "VALIDATE_KEYCODE", "String", null, null, null, null } };          for (String[] singleField : fields) {              Element field = doc.createElement("field");              field.setAttribute("name", singleField[0]);              field.setAttribute("db-name", singleField[1]);              field.setAttribute("java-type", singleField[2]);              if (singleField[3] != null)                  field.setAttribute("is-auto-generated", singleField[3]);              if (singleField[4] != null)                  field.setAttribute("is-audited", singleField[4]);              if (singleField[5] != null)                  field.setAttribute("is-primary-key", singleField[5]);              if (singleField[6] != null)                  field.setAttribute("primary-key-sequence", singleField[6]);              entity.appendChild(field);          }            Element methods = doc.createElement("methods");          rootElement.appendChild(methods);            Element method = doc.createElement("method");          methods.appendChild(method);          method.setAttribute("name", "getValidateByType");          method.setAttribute("entity-name", "Validate");          method.setAttribute("returns-collection", "TRUE");          methods.appendChild(method);            Element sql = doc.createElement("sql");          sql.appendChild(doc.createTextNode(                  "SELECT * FROM TBLVALIDATE WHERE VALIDATE_TYPE = :type ORDER BY VALIDATE_DESCRIPTION"));          method.appendChild(sql);            Element parameters = doc.createElement("parameters");          method.appendChild(parameters);            Element parameter = doc.createElement("parameter");          parameter.setAttribute("name", "oldCode");          parameter.setAttribute("java-type", "String");          parameter.setAttribute("sequence", "0");          parameters.appendChild(parameter);            method = doc.createElement("method");          methods.appendChild(method);          method.setAttribute("name", "getValidateByOldCode");          method.setAttribute("entity-name", "Validate");          method.setAttribute("returns-collection", "FALSE");          methods.appendChild(method);            sql = doc.createElement("sql");          sql.appendChild(doc.createTextNode("SELECT * FROM TBLVALIDATE WHERE VALIDATE_OLDCODE = :oldCode"));          method.appendChild(sql);            parameters = doc.createElement("parameters");          method.appendChild(parameters);            parameter = doc.createElement("parameter");          parameter.setAttribute("name", "type");          parameter.setAttribute("java-type", "String");          parameter.setAttribute("sequence", "0");          parameters.appendChild(parameter);            // write the content into xml file          TransformerFactory transformerFactory = TransformerFactory.newInstance();          Transformer transformer = transformerFactory.newTransformer();          DOMSource source = new DOMSource(doc);          StreamResult result = new StreamResult(new File(fileName));            DOMImplementation domImpl = doc.getImplementation();          DocumentType doctype = domImpl.createDocumentType("doctype", "-//Genera//DTD XML EJB 1.0//EN",                  "ejb.v1.dtd");          transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, doctype.getPublicId());          transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, doctype.getSystemId());          transformer.setOutputProperty(OutputKeys.INDENT, "yes");          transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");          transformer.transform(source, result);            System.out.println("File saved!");        } catch (ParserConfigurationException pce) {          pce.printStackTrace();      } catch (TransformerException tfe) {          tfe.printStackTrace();      }  }    private void validate() {      try {          DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();          domFactory.setValidating(true);          DocumentBuilder builder = domFactory.newDocumentBuilder();          builder.setErrorHandler(new ErrorHandler() {              @Override              public void error(SAXParseException exception) throws SAXException {                  // do something more useful in each of these handlers                  exception.printStackTrace();              }                @Override              public void fatalError(SAXParseException exception) throws SAXException {                  exception.printStackTrace();              }                @Override              public void warning(SAXParseException exception) throws SAXException {                  exception.printStackTrace();              }          });          builder.parse(fileName);      } catch (ParserConfigurationException pce) {          pce.printStackTrace();      } catch (SAXException e) {          e.printStackTrace();      } catch (IOException e) {          e.printStackTrace();      }  }    public static void main(String[] args) {      TdcToXml tdcToXml = new TdcToXml("ejb.xml");      tdcToXml.process();      tdcToXml.validate();  }    }  
https://stackoverflow.com/questions/65927211/how-do-i-use-square-brackets-in-attlist-enumeration January 28, 2021 at 04:50AM

没有评论:

发表评论