需求
将源XML
[code=XML]
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Company">
<xs:complexType>
<xs:sequence>
<xs:element ref="Name"/>
<xs:element ref="Employees" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Employees">
<xs:complexType>
<xs:sequence>
<xs:element ref="Manager"/>
<xs:element ref="Programmer"/>
<xs:element maxOccurs="unbounded" ref="Support"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Manager">
<xs:complexType>
<xs:sequence>
<xs:element ref="FirstName"/>
<xs:element ref="LastName"/>
<xs:element ref="PhoneExt"/>
<xs:element ref="Email"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Programmer">
<xs:complexType>
<xs:sequence>
<xs:element ref="FirstName"/>
<xs:element ref="LastName"/>
<xs:element ref="PhoneExt"/>
<xs:element ref="Email"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Support">
<xs:complexType>
<xs:sequence>
<xs:element ref="FirstName"/>
<xs:element ref="LastName"/>
<xs:element ref="PhoneExt"/>
<xs:element ref="Email"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="FirstName" type="xs:NCName"/>
<xs:element name="LastName" type="xs:NCName"/>
<xs:element name="PhoneExt" type="xs:integer"/>
<xs:element name="Email" type="xs:string"/>
</xs:schema>
[/code]
转换结果:
[code=XML]<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Company">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Employees" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Manager">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstName" type="xs:NCName"/>
<xs:element name="LastName" type="xs:NCName"/>
<xs:element name="PhoneExt" type="xs:integer"/>
<xs:element name="Email" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Programmer">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstName" type="xs:NCName"/>
<xs:element name="LastName" type="xs:NCName"/>
<xs:element name="PhoneExt" type="xs:integer"/>
<xs:element name="Email" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Support" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstName" type="xs:NCName"/>
<xs:element name="LastName" type="xs:NCName"/>
<xs:element name="PhoneExt" type="xs:integer"/>
<xs:element name="Email" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
[/code]
java类
[code=Java]
public static void main(String[] args) throws DocumentException, IOException {
// 获取文档
Document doc = UtilsForXML.readFileToXML("../OperateXML/src/cnn/xml/trang/company1.xsd");
Element element = doc.getRootElement();
// 获取doc的第一个element,然后获取属性Name 的值
List list = element.selectNodes(element.getPath() + "/xs:element");
// System.out.println("第一层的Element元素的个数是List1:" + list.size());
List<Element> elelist = getElementList(list);
transfomerXSD5(element, elelist);
}
public static void transfomerXSD5(Element element, List<Element> elelist) throws DocumentException, IOException {
// 创建新的Doc文档
Document resultDoc = DocumentHelper.createDocument();
// 创建RootElement
Element newRoot = resultDoc.addElement(element.getQName());
// 添加属性
for (Iterator<Attribute> it = element.attributeIterator(); it.hasNext();) {
Attribute attribute = it.next();
newRoot.addAttribute(attribute.getQName(), attribute.getStringValue());
}
// 获取第一个Element元素 Company
Element firstEle = elelist.get(0);
// 创建最外层的Element
newRoot.add((Element) firstEle.clone());
// sourceNameList
List<Element> nameList = findNameList(element);
display(nameList, newRoot);
System.out.println(UtilsForXML.getPrettyXML(newRoot.asXML()));
}
/**
* 将XSD中的分开的元素组合为一个整体
*
* @param nameList
* @param newElement
* @throws IOException
* @throws DocumentException
*/
public static void display(List<Element> nameList, Element newElement) throws IOException, DocumentException {
List<Element> refList = findRefList(newElement);
if (refList != null && nameList != null && newElement != null) {
for (int i = 0; i < refList.size(); i++) {
Element reElement = refList.get(i);
for (int j = 0; j < nameList.size(); j++) {
Element naElement = nameList.get(j);
// 如果ref 引用 name
if (reElement.attributeValue("ref").equals(naElement.attributeValue("name"))) {
Element el = (Element) naElement.clone();
if (reElement.getParent() != null) {
if (reElement.attributeValue("maxOccurs") != null && reElement.attributeValue("maxOccurs").equals("unbounded")) {
el.addAttribute("maxOccurs", "unbounded");
}
reElement.getParent().add(el);
reElement.getParent().remove(reElement);
}
}
}
display(nameList, newElement);
}
}
}
/**
* 查找<xs:element ref="name"> ElementList
*
* @param element
*/
@SuppressWarnings("unchecked")
public static List<Element> findRefList(Element element) {
// 查找所有的<xs:element>元素
List eleList = element.selectNodes("//xs:element");
// 筛选ElementList
List<Element> elelist = UtilsForXML.getElementList(eleList);
List<Element> refList = new ArrayList<Element>();
// 筛选出所有的refElementList
for (int i = 0; i < elelist.size(); i++) {
Element currentEle = elelist.get(i);
if (currentEle.attributeValue("ref") != null) {
refList.add(currentEle);
}
}
return refList;
}
/**
* 查找nameList
*
* @param element
* @return
*/
public static List<Element> findNameList(Element element) {
// 查找所有的<xs:element>元素
List<Element> eleList = element.selectNodes("//xs:element");
List<Element> elelist = UtilsForXML.getElementList(eleList);
List<Element> nameList = new ArrayList<Element>();
// 筛选出所有的refElementList
for (int i = 0; i < elelist.size(); i++) {
Element currentEle = elelist.get(i);
if (currentEle.attributeValue("name") != null) {
nameList.add(currentEle);
}
}
return nameList;
}
/**
* 筛选Element List
*
* @param list
* 可能包含node和Atrributer等其它类型的List
* @return
*/
@SuppressWarnings("unchecked")
public static List<Element> getElementList(List list) {
List<Element> elelist = new ArrayList<Element>();
for (int i = 0; i < list.size(); i++) {
if (list.get(i) instanceof Element) {
elelist.add((Element) list.get(i));
}
}
return elelist;
}
[/code]
将XSD文件中分开的元素,合并在一起
最新推荐文章于 2022-10-05 20:46:59 发布