【问题标题】:Dynamically generating XML Schema动态生成 XML Schema
【发布时间】:2013-01-07 12:28:40
【问题描述】:

我正在尝试使用 Xerces-J 动态生成 XML 模式并收到以下错误,感谢任何有关它的帮助。

DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
dbfac.setNamespaceAware(true);

DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.newDocument();

Element schema = doc.createElement("xs:schema");           
schema.setAttribute("xmlns:xs", "http://www.w3.org/2001/XMLSchema");
doc.appendChild(schema);

Element e = doc.createElement("xs:element");            
e.setAttribute("name", "test");
e.setAttribute("type", "xs:string");

schema.appendChild(e);

TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
trans.setOutputProperty(OutputKeys.INDENT, "yes");

//create string from xml tree
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);

trans.transform(source, result);
String xmlString = sw.toString();

System.out.println(xmlString);

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

Schema schema1 = schemaFactory.newSchema(source);

Output is

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="test" type="xs:string"/>
</xs:schema>

org.xml.sax.SAXParseException: s4s-elt-schema-ns: 元素 'xs:schema' 的命名空间必须来自 架构命名空间,“http://www.w3.org/2001/XMLSchema”。

【问题讨论】:

    标签: java xml xsd xerces2-j


    【解决方案1】:

    在构建 DOM 时,您无需将命名空间指定为属性。相反,请使用带有两个参数的 createElement() 版本:第一个是命名空间 URI,第二个是元素的限定名称。

    还要注意,限定名称的前缀将自动匹配命名空间 URI。如果你愿意,你可以完全消除前缀,序列化器会做正确的事情(要么创建一个不带前缀的 xmlns 属性,要么生成一个前缀)。

    【讨论】:

    • 感谢您的回复。我根据您的建议将代码更改为 Element schema = doc.createElementNS("w3.org/2001/XMLSchema", "xs:schema");我收到以下错误 s4s-elt-invalid-content.1: 'schema' 的内容无效。元素 'xs:element' 无效、放错位置或频繁出现。
    • @user1959200 - 您是否也更新了创建 element 元素的行?
    • 将 setElement 更改为 setElementNS 并将 setAttribute 更改为 setAttributeNS 有效!谢谢
    【解决方案2】:

    我遇到了类似的问题,找到了Apache Commons XMLSchema

    【讨论】:

      猜你喜欢
      • 2020-12-08
      • 2010-09-11
      • 2013-10-12
      • 2018-09-07
      • 2020-03-26
      • 2010-12-15
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      相关资源
      最近更新 更多