none
XPathDocument, XML и xml-namespaces RRS feed

  • Вопрос

  • Есть XML-ка примерно такая

    <Envelope xmlns="http://www.w3.org/2001/06/soap-envelope"> <Header> <RoutingInf xmlns="urn:customs.ru:Envelope:RoutingInf:1.0"> </RoutingInf> </Header> <Body> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <Object Id="Object"> <EPS_DocResponse DocumentModeID="1004081E" xmlns="urn:customs.ru:Information:ExchangeDocuments:EPS_DocResponse:5.0.8" xmlns:catExch_ru="urn:customs.ru:Information:ExchangeDocuments:ExchangeCommonAggregateTypes:5.0.8" xmlns:cat_ru="urn:customs.ru:CommonAggregateTypes:5.0.7" xmlns:cltExch_ru="urn:customs.ru:Information:ExchangeDocuments:ExchangeCommonLeafTypes:5.0.8" xmlns:clt_ru="urn:customs.ru:CommonLeafTypes:5.0.7"> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="urn:xml-dsig:transformation:v1.1"/> <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/> <Reference URI="#KeyInfo"> <Transforms> <Transform Algorithm="urn:xml-dsig:transformation:v1.1"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/> <DigestValue>gkolFAgjX6dERwa58bWciX0KpCdxvjtoP0NCv6U8AD8=</DigestValue> </Reference> <Reference URI="#Object"> <Transforms> <Transform Algorithm="urn:xml-dsig:transformation:v1.1"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/> <DigestValue>oKZaAAZu5IjJVLZtxJfvzBrgcsGo44t0x/vuOATxpUU=</DigestValue> </Reference> </SignedInfo> <Object Id="Object"> <TIR_Carnet DocumentModeID="1003104E" xmlns="urn:customs.ru:Information:TransportDocuments:Car:TIR_Carnet:5.0.7" xmlns:catTrans_cu="urn:customs.ru:Information:TransportDocuments:CUTransportCommonAgregateTypesCust:5.0.7" xmlns:catTrans_ru="urn:customs.ru:Information:TransportDocuments:TransportCommonAgregateTypesCust:5.0.7" xmlns:cat_ru="urn:customs.ru:CommonAggregateTypes:5.0.7" xmlns:cltTrans_cu="urn:customs.ru:Information:TransportDocuments:CUTransportCommonLeafTypesCust:5.0.0" xmlns:cltTrans_ru="urn:customs.ru:Information:TransportDocuments:TransportCommonLeafTypesCust:5.0.5" xmlns:clt_ru="urn:customs.ru:CommonLeafTypes:5.0.7" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <cat_ru:DocumentID>C2146895-F1B1-4D8C-95F4-AF186FBFE780</cat_ru:DocumentID>

    </TIR_Carnet> </Object> </Signature> </DocResponseBody> </DocResponse> <ResponcePerson><cat_ru:PersonSurname>Иванов</cat_ru:PersonSurname> <cat_ru:PersonName>Иван</cat_ru:PersonName> <cat_ru:PersonMiddleName>Иванович</cat_ru:PersonMiddleName> </ResponcePerson> </EPS_DocResponse> </Object> </Signature> </Body> </Envelope>

    Неймспейсы не всегда одни и те же, так вот вопрос как вытаскивать DocumentModeID без учета неймспейсов?! Пытаюсь вытащить с помощью Xpath, но в XPathNavigator обязательно требуется неймспейс. Трудность еще и в том, что в основном Object может быть определенное количество других <Object Id="Object"> , (в данном случае он один ). Вот весь вопрос, заранее спасибо за помощь
    • Изменено ProstoKorol 8 ноября 2012 г. 15:44
    8 ноября 2012 г. 9:34

Ответы

  • Почему многие разработчики упорно пытаются игнорировать неймспейсы в xml? Ведь это то же самое, что игнорировать неймспейсы, скажем, в коде C#.

    Или представьте такую ситуацию: приходите вы за ребёнком в детский сад, говорите: "Дайте мне Ваню". - "Вам какого - Иванова или Сидорова?" - "Да мне всё равно, лишь бы имя совпадало". Так вот нейсмпейс в данном случае, - это фамилия.

    Главное, если вы обрабатываете xml-документ, то вы, конечно же, должны знать и имена его элементов, и имена атрибутов, и все неймспейсы. Если что-то неизвестно - документ обрабатывать невозможно. Тем более вы собираетесь передавать вложенные документы на дальнейшую обработку.

    А вообще, неймспейс любого элемента всегда можно получить. В чём проблема?

    • Помечено в качестве ответа Abolmasov Dmitry 22 ноября 2012 г. 7:59
    14 ноября 2012 г. 12:41

Все ответы

  • Ту проще взять вашу XML как текстовую строку и вынуть нужную инфу с помощью регулярных выражений.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа ProstoKorol 8 ноября 2012 г. 15:44
    • Снята пометка об ответе ProstoKorol 8 ноября 2012 г. 15:44
    8 ноября 2012 г. 13:59
    Отвечающий
  • Думал уже над этим...Это не подойдет, потому что если будет, например, тройная вложенность документа, то это приведет к неправильному выдергиванию ID, что естественно критично
    8 ноября 2012 г. 15:47
  • Значит я так и не понял что вам нужно. По вашему первому посту я понял что нужно достать из документа строку
    DocumentModeID="1003104E"
    ну или только значение в кавычках. Регулярные выражения идеально подходят не зависимо от вложенности, вытащатся все. Либо уточните мне что не получается реализовать с помощью рег.выражений.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    8 ноября 2012 г. 16:02
    Отвечающий
  • Так как документ может быть сложным (т.е иметь вложенные документы), необходимо отдельно вытаскивать xml каждого документа, и потом по каждому из них необходимо находить DocumentModeID и далее в другую функцию отдавать xml документа и DocumentModeID.  Xpath я думал мне поможет для вычисление некоторых общих заголовков идущих до документов, а по остальному надо работать отдельно по каждому вложенному документу, т.е искать Signature и брать первый идущий элемент (это будет документ), или находить DocumentModeID и вырезать полностью его элемент-владелец.

    • Изменено ProstoKorol 9 ноября 2012 г. 15:17
    9 ноября 2012 г. 12:22
  • Почему многие разработчики упорно пытаются игнорировать неймспейсы в xml? Ведь это то же самое, что игнорировать неймспейсы, скажем, в коде C#.

    Или представьте такую ситуацию: приходите вы за ребёнком в детский сад, говорите: "Дайте мне Ваню". - "Вам какого - Иванова или Сидорова?" - "Да мне всё равно, лишь бы имя совпадало". Так вот нейсмпейс в данном случае, - это фамилия.

    Главное, если вы обрабатываете xml-документ, то вы, конечно же, должны знать и имена его элементов, и имена атрибутов, и все неймспейсы. Если что-то неизвестно - документ обрабатывать невозможно. Тем более вы собираетесь передавать вложенные документы на дальнейшую обработку.

    А вообще, неймспейс любого элемента всегда можно получить. В чём проблема?

    • Помечено в качестве ответа Abolmasov Dmitry 22 ноября 2012 г. 7:59
    14 ноября 2012 г. 12:41
  • Привет. Пожалуйста, не бросайте топик без ответа. Спасибо.

    Для связи [mail]

    22 ноября 2012 г. 7:59