xml 的有效 xs 类型是什么 - 无效的 xml 个字符
what is the valid xs type for xml - invalid xml characters
我正在尝试开发一个应该接受 xml 数据并用它生成 pdf 的端点。我已经创建了 xsd 文件,我用它来生成 JAXB Classes
并且我声明 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, "");
然后将其传递给端点。问题是由于无效字符,我仍然会遇到异常。那么解决这个问题的更好方法是什么?是否有一种类型可以在 xsd
级别上声明 request
类型,这样我就不必担心无效字符,或者是否有更好的方法从文件系统?
谢谢。
如果不修改 WSDL 来处理 XML 文件的架构,恕我直言,您不能将其设置为 XML。
共有三个选项:
1,修改你的 WSDL 并将你的 XML 文件的模式集成到其中,然后在创建 SOAP 请求时,将你的 XML 文件的内容复制到请求中(我的意思是不是字符串,解析它并从一个节点到另一个节点构建整个文件(或者尝试反序列化应该在 WSDL 的 WSDL/XSD 中定义的根元素的复杂类型,但是这真的不容易让它工作) 在 SOAP 请求中)。
2、修改你的 WSDL,启用 MTOM 并添加你的文件作为附件(这是最有效的上传方式,我认为你的编码是安全的)
3,使用原始的 WSDL,如果您的 xml 有一个 xs:string 字段,请将整个 xml 读入一个字符串(就像您在 post) 然后 Base64 对其进行编码(使用一些定义的编码)并在服务器存根中使用相同的定义编码对其进行解码。
找到@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
}
我正在尝试开发一个应该接受 xml 数据并用它生成 pdf 的端点。我已经创建了 xsd 文件,我用它来生成 JAXB Classes
并且我声明 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, "");
然后将其传递给端点。问题是由于无效字符,我仍然会遇到异常。那么解决这个问题的更好方法是什么?是否有一种类型可以在 xsd
级别上声明 request
类型,这样我就不必担心无效字符,或者是否有更好的方法从文件系统?
谢谢。
如果不修改 WSDL 来处理 XML 文件的架构,恕我直言,您不能将其设置为 XML。
共有三个选项:
1,修改你的 WSDL 并将你的 XML 文件的模式集成到其中,然后在创建 SOAP 请求时,将你的 XML 文件的内容复制到请求中(我的意思是不是字符串,解析它并从一个节点到另一个节点构建整个文件(或者尝试反序列化应该在 WSDL 的 WSDL/XSD 中定义的根元素的复杂类型,但是这真的不容易让它工作) 在 SOAP 请求中)。
2、修改你的 WSDL,启用 MTOM 并添加你的文件作为附件(这是最有效的上传方式,我认为你的编码是安全的)
3,使用原始的 WSDL,如果您的 xml 有一个 xs:string 字段,请将整个 xml 读入一个字符串(就像您在 post) 然后 Base64 对其进行编码(使用一些定义的编码)并在服务器存根中使用相同的定义编码对其进行解码。
找到@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
}