2010-03-13 3 views
2

У меня есть сообщение SOAP (см. Ниже).Как я могу получить имя пространства имен из сообщения SOAP?

Использование Xpath, как я могу извлечь имя пространства имен из этого сообщения? Другими словами, существует ли процедура Xpath, которая вернет текст «validateNewOrder»?

Любые предложения или помощь будут неоценимы. Я искал везде, но не нашел решения. Это сводит меня с ума ...

Спасибо!

<?xml version='1.0' encoding='UTF-8'?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<SOAP-ENV:Body> 
    <ns1:validateNewOrder xmlns:ns1="http://sire.rabobank.nl/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <sireheader xmlns="http://sire.rabobank.nl/"> 
     <sender> 
     <compid>TEST</compid> 
     </sender> 
    </sireheader> 
    <order xmlns="http://sire.rabobank.nl/"> 
     <account>123456789</account> 
    </order> 
    </ns1:validateNewOrder> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
+0

'validateNewOrder' в вашем примере не имеет ничего общего с пространствами имен, это локальное имя элемента. URI пространства имен является 'http: // sire.rabobank.nl /', а префикс пространства имен - 'ns1'. Нет такой вещи, как «имя пространства имен». – skaffman

+0

Спасибо, что начинает делать все понятнее! Есть ли у вас какие-либо предложения о том, как я могу получить локальное имя elemen'ts? Я тяну то, что осталось от моих волос, пытаясь получить синтаксис записи для моего запроса Xpath. Olly – olly

+0

Hi Skaddman. Теперь у меня есть мое решение. Спасибо за вашу помощь. olly – olly

ответ

1
local-name(/*[local-name() = 'Envelope']/*[local-name() = 'Body']/*[1]) 

Возвращает локальное имя первого элемента под Body в пространстве имен агностического образом.

Испытано его (C#)

XDocument doc = XDocument.Load(@"XMLFile1.xml"); 
var xpath = "local-name(/*[local-name() = 'Envelope']/*[local-name() = 'Body']/*[1])"; 
var res = doc.Root.XPathEvaluate(xpath); 
+0

Hi Obalix Спасибо. Я попробовал ваше предложение, но он дал синтаксическую ошибку. Поэтому я пробовал // * [local-name() = 'Envelope']/* [local-name() = 'Body']/* [local-name (* [1])] Но это дало мне «TEST123456789», а не «validateNewOrder». Знаете ли вы, что я делаю неправильно? Я новичок в SOAP, поэтому я все еще недопонимаю много вещей. Ps - Я использовал сайт http://www.xmlme.com/XpathTool.aspx, чтобы проверить свой запрос Xpath Спасибо! Olly – olly

+0

@olly: Хорошо, в запросе было две ошибки, они исправили их и протестировали запрос с помощью прилагаемого кода. Сайт, который вы цитируете, может обрабатывать только запросы, возвращающие набор узлов. Поэтому, если вы хотите проверить, выбран ли правильный элемент, просто откройте внешнее 'local-name()' и вставьте остальное в инструмент. То есть '/ * [local-name() = 'Envelope']/* [local-name() = 'Body']/* [1]' – AxelEckenberger

+0

Hi Obalix. Спасибо за исправление. Однако, когда я вставляю его в инструмент, инструмент возвращает «TEST12345689». Это не то, что я хочу получить. То, что я хочу вернуть, - это значение «validateNewOrder». Или я неправильно понял ваш ответ. Извините, если мой вопрос кажется немым, но я новичок в SOAP ... – olly

1

У меня есть мое решение, благодаря пользовательским Обеликса.

Xpath запрос, который мне нужен был

local-name(/*[local-name() = 'Envelope']/*[local-name() = 'Body']/*[1]) 

Это не работает на испытательном полигоне, который я использовал (по-видимому, на месте я цитировал может обрабатывать только запросы, которые возвращают набор узлов), но делает работать в моем Java-коде.

Теперь я могу выйти и наслаждаться выходными

Olly

+0

@olly: Нехорошо, чтобы рекотировать решение, предоставленное кому-то другим. Тем не менее, он хороший стиль, чтобы принять и/или повысить уровень личности, предоставившей вам решение, и тем самым вознаградить их за их усилия. – AxelEckenberger

+0

Извините, Obalix. Я раньше этого не использовал. Я думаю, что теперь я ответил вам на ваш ответ. Дайте мне знать, если это не сработает. У меня еще нет учетной записи, чтобы попытаться продвигать ваш ответ, но когда я это выясню, я буду продвигать ваш ответ. – olly

Смежные вопросы