#java #xml #eclipse #xml-parsing #java-7
#java #xml #eclipse #xml-синтаксический анализ #java-7
Вопрос:
Не могли бы вы, пожалуйста, проверить, что не так с этим XML. Клиент отправляет этот XML-запрос для обработки моего приложения.
<soapenv:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:eze="http://ezeepay_test">
<soapenv:Header/>
<soapenv:Body>
<eze:RequestService
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<InputXml xsi:type="xsd:string">
<?xml version="1.0"
encoding="UTF-8"?>
<Request>
<BankID>05</BankID>
<TransactionID>1004114741235</TransactionID>
<TransactionType>Payment</TransactionType>
<ServiceType>Bill</ServiceType>
<TransactionDateStamp>04-04-2019 11:43:13</TransactionDateStamp>
<Amount>500</Amount>
<PaymentType>Cash</PaymentType>
</Request>
</InputXml>
</eze:RequestService>
</soapenv:Body>
</soapenv:Envelope>
Мне нужно использовать XPath для перебора узлов для чтения элементов. Но когда я анализирую этот XML, я получаю следующую ошибку.
Я обрабатываю его с помощью DocumentBuilderFactory.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
//This is where I am getting Error.
Document doc = db.parse(new InputSource(new StringReader(XMLRequestString)));
Пожалуйста, дайте мне знать, какие манипуляции я могу выполнить на своем уровне кода.
Комментарии:
1. Проблема в XML, который вы анализируете. Это фундаментально нарушено. Недопустимо встраивать инструкцию обработки (PI) с именем «xml» в документ. Это может отображаться только в прологе XML-документа; т. е. в начале; см. w3.org/TR/xml/#NT-prolog
2. На вашем уровне кода нет надлежащих «манипуляций», которые вы могли бы выполнить, чтобы исправить это. Проблема должна быть устранена путем исправления того, что генерирует этот недопустимый XML.
3. У меня нет доступа для манипулирования недопустимым XML в клиентском коде. Поскольку клиент запрашивает наше приложение, используя этот XML, нам необходимо изменить код на нашей стороне. Прямо сейчас я ищу <?xml-тег и беру подстроку до тега </Request> . Чтобы я мог правильно обработать запрос.
4. У вас есть определенный интерфейс с вашим клиентом, представляющий контракт, и вы мудро решили определить этот интерфейс с использованием международных стандартов, таких как SOAP и XML. Если вы переключитесь на использование проприетарного варианта этих стандартов, то в конечном итоге вы увеличите затраты для обеих сторон интерфейса, потому что вы больше не сможете использовать готовые инструменты. Использование стандартов экономит деньги! Не позволяйте другой стороне контракта отклоняться от спецификации, каким бы заманчивым это ни казалось; вы выбрасываете деньги на ветер.
Ответ №1:
Ответ на вопрос заключается в том, что отправленные данные не соответствуют стандартам SOAP и XML, и ваш сервер совершенно прав, отклоняя их. Конкретное правило, которое оно нарушает, заключается в том, что конструкция <?xml....?>
может отображаться только в начале документа (это было бы объявлением XML, если бы оно появилось в начале; это была бы инструкция обработки, если бы она не была названа «xml»; как есть, это ни то, ни другое).
Не поддавайтесь искушению изменить код вашего сервера, чтобы принимать любой мусор, который отправляет вам клиент: это путь к краху.
Комментарии:
1. Я согласен с вами. Это то, что даже я пробовал изначально. На самом деле у нас есть наша производственная среда, которая использует этот запрос. В моем случае я работаю над созданием среды моделирования сервиса, где я должен использовать только этот XML. Я изо всех сил старался убедить клиента, что использование неверно отформатированного XML не работает. Поскольку это бизнес-требование, они не желают ничего менять в своем коде, поскольку он работает в производственной среде. Я надеюсь, вы поймете мою ситуацию.
2. Внимательно прочитайте детали вашего контракта с заказчиком. Если в контракте указаны требования, а в требованиях указано, что API реализован как SOAP / XML, то ваш клиент нарушает контракт. Это недопустимый SOAP / XML. То, что они просят-это разновидность договора, и вы не вправе взимать дополнительные реализовать это изменение.
3. ДА. Мы понимаем вашу ситуацию. Но я (по крайней мере) думаю, что вы неправильно управляете своими отношениями с клиентами.
4. Да, я понимаю вашу проблему. Я работал в компаниях, которые делали катастрофические вещи со своими продуктами, потому что они думали, что клиент всегда прав. Опыт научил меня сопротивляться таким требованиям.