【发布时间】:2016-09-04 19:17:01
【问题描述】:
我看过一些帖子,我们可以在其中向 XML 添加根元素,但我想在传入的 XSD 周围专门添加根复杂元素。我在这里看到了两种情况,其中现有 XSD 根元素是命名类型或匿名的:
所以如果 xsd 带有命名的根元素:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://a.b/c/d" elementFormDefault="qualified">
<xs:element name="oldRoot" type="oldRoot"/>
应该转化为:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://a.b/c/d" elementFormDefault="qualified">
<xs:element name="newRoot">
<xs:complexType>
<xs:sequence>
<xs:element name="oldRoot" type="oldRoot"/>
</xs:sequence>
</xs:complexType>
</xs:element>
还有一个匿名类型的 XSD:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://a.b/c/d" elementFormDefault="qualified">
<xs:element name="oldRoot">
<xs:complexType>
<xs:sequence>
<xs:element name="oldChild1">
<xs:complexType>
<xs:sequence>
<xs:element name="someElement" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
应该转化为
<xs:element name="newRoot">
<xs:complexType>
<xs:sequence>
<xs:element name="oldRoot"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="oldRoot">
<xs:sequence>
<xs:element name="oldChild1">
<xs:complexType>
<xs:sequence>
<xs:element name="someElement" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
我正在使用 DOM 解析器来帮助我进行这些编辑,但是 DOM 解析器可以用于上述两种情况吗?
那么我可以构造新的根元素,然后将旧的根元素嵌入其中吗?这是我如何解决这个问题还是有其他方法?
代码:
is = new FileInputStream("/home/xyz/testing.xsd");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document oldDoc = builder.parse(is);
Node oldRoot = oldDoc.getDocumentElement();
Document newDoc = builder.newDocument();
Element newComplexType = newDoc
.createElement("xs:complexType");
Element newSequence = newDoc.createElement("xs:sequence");
Element newElement = newDoc.createElement("xs:element");
newComplexType.setAttribute("name", "newRoot");
newDoc.appendChild(newComplexType);
newComplexType.appendChild(newDoc.importNode(oldRoot, true));
【问题讨论】:
-
您尝试过任何 Java 代码吗?
-
@TimBiegeleisen,已经添加了代码,但是如果我添加一个新的根元素,DOM 是否会对现有的 XSD 进行更改? ,我不能。
-
<xs:element name="oldRoot"/>没有类型。它不会自动使用<xs:complexType name="oldRoot">类型。但除此之外是:XSD 是 XML,因此 DOM 可以解析、操作和保存它。 -
我的回答对您的问题有帮助吗?