将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]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
从 WSDL 和 XSD 文件获取请求地址和接口的方式和方法都与语言和工具有关。一般来说,WSDL 文件定义了 Web 服务的接口和绑定,而 XSD 文件则定义了 Web 服务所使用的 XML 数据格式。 你可以使用一些工具来解析 WSDL 和 XSD 文件,例如 Apache CXF、JAX-WS、WSDL4J 等等。以 Java 为例,以下代码演示了如何使用 Apache CXF 来获取 WSDL 文件第一个服务的 endpoint address 和接口名称: ```java import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; import org.apache.cxf.service.model.BindingOperationInfo; import org.apache.cxf.service.model.ServiceInfo; import javax.wsdl.*; import javax.wsdl.factory.WSDLFactory; import javax.wsdl.xml.WSDLReader; import java.io.File; import java.net.URL; public class WsdlXsdEndpointAddressExample { public static void main(String[] args) throws Exception { URL wsdlUrl = new URL("http://example.com/Service?wsdl"); WSDLFactory factory = WSDLFactory.newInstance(); WSDLReader reader = factory.newWSDLReader(); reader.setFeature("javax.wsdl.verbose", false); reader.setFeature("javax.wsdl.importDocuments", true); Definition definition = reader.readWSDL(wsdlUrl.toString()); Service service = definition.getServices().values().iterator().next(); String endpointAddress = ((Port) service.getPorts().values().iterator().next()).getAddress().getLocation(); System.out.println("Endpoint Address: " + endpointAddress); JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance(); Client client = clientFactory.createClient(endpointAddress); ServiceInfo serviceInfo = client.getEndpoint().getEndpointInfo().getService(); BindingOperationInfo bindingOperationInfo = serviceInfo.getBinding().getOperations().iterator().next(); String operationName = bindingOperationInfo.getOperationInfo().getName().getLocalPart(); System.out.println("Operation Name: " + operationName); File xsdFile = new File("schema.xsd"); URL xsdUrl = xsdFile.toURI().toURL(); client.getRequestContext().put("schema-validation-enabled", true); client.getRequestContext().put("schema-validation-type", "XMLSchema"); client.getRequestContext().put("schema-validation-file", xsdUrl.toString()); Object[] response = client.invoke(operationName, "Request Data"); System.out.println("Response: " + response[0]); } } ``` 在上面的示例代码,我们首先使用 WSDLReader 从 WSDL 文件读取服务定义,然后获取第一个服务的 endpoint address。然后,我们使用 JaxWsDynamicClientFactory 创建一个动态客户端,并从客户端获取服务信息和操作信息。接着,我们从 XSD 文件读取 XML Schema 定义,并将其设置为客户端的请求上下文。最后,我们调用操作并输出响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值