Как создать XML из схемы XSD? - PullRequest
1 голос
/ 19 мая 2011

У меня есть схема xsd .. Как я могу сгенерировать XML, используя эту схему программно в Java ..?и это должно быть динамическим, значит, я могу дать любую схему.Есть ли какая-нибудь библиотека для этого?Я уже видел другой пост, но, к сожалению, он меня не устроил .., пожалуйста, дайте идеи тура .... ???Я не нахожу подходов, чтобы сделать то же самое.

Ответы [ 3 ]

0 голосов
/ 19 мая 2011

Взгляните на эту ссылку:

JAVA: создание XML-документа с использованием выражений XPath

И перейдите по этой ссылке под заголовком XPath:

http://www.vogella.de/articles/JavaXML/article.html

Я думаю, это должно вам помочь ...:)

0 голосов
/ 24 мая 2011

Следующий код выполняет проверку в соответствии с вашими потребностями, , а также сообщает номер строки, в которой произошла ошибка при синтаксическом анализе Вам понадобятся следующие jar-файлы для запуска этого кода

Только изменение коданеобходим в методе validateSchema (), где необходимо заменить аргументы ответа на запрос строковым представлением вашего xml и строковым представлением вашего XSD.

resolver.jar, xml-apis.jar, serializer.jar, xercesImpl.jar

import org.apache.xerces.parsers.SAXParser;
import org.apache.xerces.xni.Augmentations;
import org.apache.xerces.xni.NamespaceContext;
import org.apache.xerces.xni.XMLLocator;
import org.apache.xerces.xni.XNIException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Performs validation on XML based on the XSD. Overrides the
 * {@link SAXParser}.
 *
 *
 */
public class ValidateSchema extends SAXParser {

  /**
   * Container for current line and coloum number being parsed in the XML.
   */
  private XMLLocator locator;

  /**
   * Default public constructor.
   */
  public ValidateSchema() {
    super();
  }

  /**
   * Used for obtaining the {@link XMLLocator} locator object.
   */
  @Override
  public void startDocument(
      XMLLocator locator, String encoding, NamespaceContext namespaceContext, Augmentations augs)
      throws XNIException {
    this.locator = locator;
    super.startDocument(locator, encoding, namespaceContext, augs);
  }

  /**
   * Validates the XML against the provided XSD.
   *
   * @param req HttpServletRequest object.
   * @param resp HttpServletResponse object.
   * @throws IOException
   */
  public void validateSchema(HttpServletRequest req, HttpServletResponse resp)
      throws IOException {
    String content = req.getParameter("data");
    String selectbox = req.getParameter("selectbox");
    content = content.trim();

    // Convert the XML string to byte stream.
    InputStream is = new ByteArrayInputStream(content.getBytes());

    try {
      this.setFeature(Constants.VALIDATION_PROP, true);
      this.setFeature(Constants.SCHEMA_PROP, true);
      this.setFeature(Constants.DYNAMIC_PROP, true);
      this.setFeature(Constants.SCHEMA_CHECKING_PROP, true);
      if("1".equalsIgnoreCase(selectbox)) {
    this.setProperty(Constants.SCHEMA_LOC,"oem.xsd" );
      } else if("2".equalsIgnoreCase(selectbox)) {
    this.setProperty(Constants.SCHEMA_LOC,"carrier.xsd" );
      }

      Validator handler = new Validator();
      this.setErrorHandler(handler);

      InputSource isp = new InputSource();
      isp.setByteStream(is);
      isp.setEncoding("UTF-8");
      this.parse(isp);

      if (handler.validationError == true) {
    StringBuffer errorMessage = new StringBuffer(512);
    errorMessage
        .append("<div style='background: #ffebe6;border: 0px solid #ffe0d7;color:#c10000;height:60px;padding: 5px;'>")
        .append(Constants.INVALID_XML_DOCUMENT)
        .append(" LineNo: ")
        .append(handler.saxParseException.getLineNumber())
        .append(" ColumnNo: ")
        .append(handler.saxParseException.getColumnNumber())
        .append("<br/>")
        .append(handler.validationError)
        .append(handler.saxParseException.getMessage())
        .append("</div>");
    System.out.println( errorMessage );
      } else {
    StringBuffer validMsg = new StringBuffer(512);
    validMsg.append("<div style='background: #ebeff9;border: 0px solid #6b90da;height:60px;padding: 5px;'>")
    .append(Constants.VALID_XML_DOCUMENT).append("</div>");
    System.out.println( validMsg );
      }
    } catch (SAXException e) {
      StringBuffer errorMessage = new StringBuffer(512);
      errorMessage
      .append("<div style='background: #ffebe6;border: 0px solid #ffe0d7;color:#c10000;height:60px;padding: 5px;'>")
      .append(Constants.INVALID_XML_DOCUMENT)
      .append(" LineNo: ")
      .append(this.locator.getLineNumber())
      .append(" ColumnNo: ")
      .append(this.locator.getColumnNumber())
      .append(" <br/>")
      .append(e.getMessage())
      .append("</div>");
    System.out.println( errorMessage );
    } catch (Exception e) {
      StringBuffer errorMessage = new StringBuffer(512);
      errorMessage
      .append("<div style='background: #ffebe6;border: 1px solid #ffe0d7;color:#c10000;height:60px;padding: 5px;'>")
      .append(Constants.INVALID_XML_DOCUMENT)
      .append(" <br/>")
      .append(e.getMessage())
      .append("</div>");
     System.out.println( errorMessage );
    }
  }

  /**
   * Writes back the response to client.
   * 
   * @param msg Response message.
   * @param resp HttpServletResponse object.
   * @throws IOException
   */
  private void responseWrite(
      String msg, HttpServletResponse resp) throws IOException {
    resp.setContentType("text/html");
    resp.getWriter().write(msg);
  }

  /**
   * Custom handler for Errors while parsing documents.
   */
  private class Validator extends DefaultHandler {
    public boolean validationError = false;
    public SAXParseException saxParseException = null;

    /**
     * @throws SAXException
     */
    @Override
    public void error(SAXParseException exception) throws SAXException {
      validationError = true;
      saxParseException = exception;
    }

    /**
     * @throws SAXException
     */
    @Override
    public void fatalError(SAXParseException exception) throws SAXException {
      validationError = true;
      saxParseException = exception;
    }

    /**
     * @throws SAXException
     */
    @Override
    public void warning(SAXParseException exception) throws SAXException {
    }
  }
}

Constants.Java содержит свойства проверки, которые необходимо указать

public final class Constants {

public static final String VALIDATION_PROP = "http://xml.org/sax/features/validation";
public static final String SCHEMA_PROP = "http://apache.org/xml/features/validation/schema";
public static final String DYNAMIC_PROP = "http://apache.org/xml/features/validation/dynamic";
public static final String SCHEMA_CHECKING_PROP =
    "http://apache.org/xml/features/validation/schema-full-checking";
public static final String SCHEMA_LOC =
    "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";
public static final String VALID_XML_DOCUMENT = "The above XML is valid.";
public static final String INVALID_XML_DOCUMENT = "The Document has error at:";

}

0 голосов
/ 19 мая 2011

XPath не является инструментом для генерации XML. Боюсь, вы пытаетесь достичь своей цели с помощью неправильных инструментов. Поэтому я думаю, что ответ на ваш вопрос: вы не можете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...