что является допустимым типом xs для xml - недопустимые символы xml - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь разработать конечную точку, которая должна принимать данные 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, "");

затем передайте его в конечную точку. Проблема в том, что я все еще получаю исключения из-за недопустимых символов. Итак, как лучше решить эту проблему? Есть ли тип для объявления типа request на уровне xsd, чтобы мне не приходилось беспокоиться о недопустимых символах, или есть лучший способ прочитать файл xml из файловой системы? Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Нашел решение, предложенное @ ma4gic 3-й вариант. На самом деле не было необходимости удалять какие-либо символы из исходного 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 и получите доступ к переданным данным в веб-службе следующим образом:

@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
}
0 голосов
/ 30 августа 2018

Вы не можете установить его как XML без изменения WSDL для обработки схемы вашего XML-файла IMHO.

Существует три варианта:

1, измените ваш WSDL и интегрируйте в него схему вашего XML-файла, затем при создании запроса SOAP скопируйте содержимое вашего XML-файла в запрос (я имею в виду не как строку, проанализируйте его и соберите весь файл из узел-узел (или попытаться десериализовать сложный тип корневого элемента, который также должен быть определен в WSDL / XSD WSDL, однако на самом деле это не так легко заставить его работать) в запросе SOAP).

2, измените ваш WSDL, включите MTOM и добавьте ваш файл в качестве вложения (это самый эффективный способ загрузить его, и я думаю, что ваша кодировка будет безопасна)

3, используйте исходный WSDL, если у вас есть поле xs: string для вашего xml, прочитайте весь xml в строку (как вы это делали в своем посте), затем Base64 закодируйте его (с определенной кодировкой) и в серверная заглушка декодирует его, используя ту же определенную кодировку.

...