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

Java xml的有效xs类型是什么-无效的xml字符,java,xml,web-services,soap,endpoint,Java,Xml,Web Services,Soap,Endpoint,我正在尝试开发一个端点,它应该接受xml数据并用它生成pdf。我已经创建了用于生成JAXB类的xsd文件,并将请求的xs类型声明为如下字符串: <xs:element name="producepdf-request"> <xs:complexType> <xs:sequence> <xs:element name="xmlData" type="xs:string" />

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

<xs:element name="producepdf-request">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="xmlData" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
</xs:element>
File xmlDocument = new File("C:\\Users\\stu\\Desktop\\fileName.xml");
String xmlData = FileUtils.readFileToString(xmlDocument, "UTF-8");
@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
}
并清除无效字符:

String xml10pattern = "[^"
                    + "\u0009\r\n"
                    + "\u0020-\uD7FF"
                    + "\uE000-\uFFFD"
                    + "\ud800\udc00-\udbff\udfff"
                    + "]";
xmlData  = xmlData.replaceAll(xml10pattern, "");
然后将其传递到端点。问题是,由于无效字符,我仍然会遇到异常。那么,解决这个问题的更好方法是什么呢?是否有一种类型可以在
xsd
级别声明
请求
类型,这样我就不必担心无效字符,或者是否有更好的方法从文件系统读取xml文件?
谢谢。

如果不修改WSDL以处理XML文件IMHO的模式,则无法将其设置为XML

有三种选择:

1、修改WSDL并将XML文件的模式集成到其中,然后在创建SOAP请求时,将XML文件的内容复制到请求中(我的意思是不作为字符串,解析它并在节点之间构建整个文件)(或者尝试在SOAP请求中反序列化根元素的complextype,该根元素也应该在WSDL的WSDL/XSD中定义,但是这确实不容易实现)

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


3、使用原始WSDL,如果您的xml有一个xs:string字段,请将整个xml读入一个字符串(正如您在文章中所做的那样),然后对其进行Base64编码(使用一些已定义的编码)在服务器存根中,使用相同的定义编码对其进行解码。

找到了@ma4gic 3rd option所建议的解决方案。实际上,不需要从原始xml文件中删除任何字符,该文件已转换为
字符串,而且
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服务中传递的数据,如下所示:

<xs:element name="producepdf-request">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="xmlData" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
</xs:element>
File xmlDocument = new File("C:\\Users\\stu\\Desktop\\fileName.xml");
String xmlData = FileUtils.readFileToString(xmlDocument, "UTF-8");
@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
}

很可能您的endpoint/servlet/webservice使用UTF-8编码上传了请求主体。如果是servlet,最好看看如何向您发送文件(客户端代码)以及尝试读取文件的内容(如果是servlet)。谢谢@m4gic。我的端点是一个soap web服务,客户端是一个控制器。我确信我发送的数据正在被读取,这就是我收到异常的原因。否?很好。你在控制器上的意思是什么?你如何组合你的请求?只是一个控制器,当应用程序中发生某种情况时会触发它(这部分工作正常,也不相关)。我将端点所需的参数放在一起,并创建一条soap消息来调用它。问题是在创建JAXB类之前,xsd级别上是否有更好的xml数据类型,或者是否有更好的方法将xml数据转换为字符串。但是,第三个选项对于我不推荐的大型文件来说效率不太高。谢谢您的支持答案。实际上我喜欢第三个选项:)你能举个例子,说明如何对字符串进行Base64编码并将其保持为字符串吗?你是(假设你使用的是java8)非常感谢。感谢你的努力。