【问题标题】:How to generate xml from xsd schema?如何从 xsd 模式生成 xml?
【发布时间】:2011-08-28 18:10:11
【问题描述】:

我有 xsd 架构..如何在 java 中以编程方式使用此架构生成 xml..?它应该是动态的,这意味着我可以给出任何模式。 有没有图书馆可以做同样的事情。? 我也看过其他帖子,但不幸的是它不适合我..请提供旅游建议....??? 我没有找到任何方法来做同样的事情。

【问题讨论】:

  • XPath 允许您从现有 XML 文档的一部分中提取值,而不是生成 XML 文档。您是说您的哈希图是 XPath 到该 XPath 值的映射吗?如果是这样,就可以从模式中生成一个文档,然后用你的 hashmap 中的值填充它。
  • 请更具体一些。据我所知,xpath 用于在现有 XML 文档中进行查询,而不是用于创建它们。提供您拥有的数据和您期望的结果的示例
  • 是的 Paul Ruane,你是对的..我将 XPath 映射到该 XPath 的值..那么我如何从模式生成文档并使用我的哈希映射中的值填充它。? ?..请探索这个想法..我认为这就是我需要做的......
  • 考虑改用 XML Author (oxygenxml.com/xml_author.html) 等工具。这些允许用户创建基于 XML 模式文件并与之兼容的 XML 文档。

标签: java xpath xsd


【解决方案1】:

XPath 不是生成 XML 的工具。恐怕您正在尝试使用错误的工具来实现目标。所以,我认为你的问题的答案是:你不能。

【讨论】:

    【解决方案2】:

    看看这个链接:

    JAVA: Build XML document using XPath expressions

    并通过 XPath 标题下的此链接:

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

    我认为这应该可以帮助您...:)

    【讨论】:

      【解决方案3】:

      以下代码根据您的需要执行验证, 还会告诉你解析过程中出错的行号 您将需要以下 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:";
      

      }

      【讨论】:

      • 我不想验证 xml...我没有任何 xml。我必须使用模式从根节点生成 xml...
      • @samash 请接受我对您的问题的误解。
      猜你喜欢
      • 2014-07-03
      • 2018-06-30
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多