将XSD文件中分开的元素,合并在一起

需求
将源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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值