xml的有效xs类型是什么-无效的xml字符

时间:2018-08-30 11:54:46

标签: java xml web-services soap endpoint

我正在尝试开发一个端点,该端点应接受xml数据并使用它生成pdf。我已经创建了用于生成JAXB Classes的xsd文件,并声明请求的xs类型为字符串,如下所示:

<xs:element name="producepdf-request">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="xmlData" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
</xs:element>

但是当我将XML数据作为String传递到此端点时,会导致xml出现很多无效的IOException字符。我创建所需的xml数据来像这样调用此端点:

File xmlDocument = new File("C:\\Users\\stu\\Desktop\\fileName.xml");
String xmlData = FileUtils.readFileToString(xmlDocument, "UTF-8");

并清除无效字符:

String xml10pattern = "[^"
                    + "\u0009\r\n"
                    + "\u0020-\uD7FF"
                    + "\uE000-\uFFFD"
                    + "\ud800\udc00-\udbff\udfff"
                    + "]";
xmlData  = xmlData.replaceAll(xml10pattern, "");

然后将其传递给端点。问题是由于字符无效,我仍然会收到异常。那么解决这个问题的更好方法是什么?是否有一种类型可以在request级别声明xsd类型,这样我就不必担心无效字符,或者是否有更好的方法从文件系统中读取xml文件? 谢谢。

2 个答案:

答案 0 :(得分:1)

如果不修改WSDL来处理XML文件IMHO的架构,就不能将其设置为XML。

共有三个选项:

1,修改WSDL并将XML文件的模式集成到其中,然后在创建SOAP请求时,将XML文件的内容复制到请求中(我的意思是不是以字符串的形式进行解析,然后从中构建整个文件SOAP请求中的一个节点到另一个节点(或尝试反序列化应该在WSDL的WSDL / XSD中定义的根元素的复杂类型,但这实际上并不容易实现)。

2,修改您的WSDL,启用MTOM并将文件添加为附件(这是上传文件的最有效方法,我认为您的编码是安全的)

3,使用原始的WSDL,如果您的xml有一个xs:string字段,则将整个xml读取为一个String(就像您在帖子中所做的那样),然后对Base64进行编码(使用某种定义的编码),然后服务器存根使用相同的定义编码对其进行解码。

答案 1 :(得分:0)

找到了@ ma4gic第三选项建议的解决方案。实际上,没有必要从原始XML文件中删除任何字符,而该原始文件已变成String,并且<xs:element name="xmlData" type="xs:string" />xsd级别上也可以。

因此第一步是将xml转换为byteArray,然后在调用方中使用Base64对其进行编码:

File xmlDocument = new File("path/to/file.xml");
            byte[] binaryData = FileUtils.readFileToByteArray(xmlDocument);
            String xmlDataEncoded = org.apache.commons.codec.binary.Base64.encodeBase64String(binaryData);

然后将xmlDataEncoded传递到SOAPMessage中的Web服务,并按以下方式访问Web服务中传递的数据:

@PayloadRoot(localPart="producepdf-request", namespace="http://www.my.com/name/space/model/")
@ResponsePayload
public ProducepdfResponse producePdf(@RequestPayload ProducepdfRequest document) throws IOException {

     byte[] incomingBinary = org.apache.commons.codec.binary.Base64.decodeBase64(document.getXmlData());
     String incomingDataRaw = new String(incomingBinary, "UTF-8");
    //do your stuff with the data
}