Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 8

Пространства имен в XML

23.03.2012, 11:24. Показов 5325. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья! Доброе утро! Прошу помощи
Есть XML-файл, примерно следующего вида:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
      <ns0:Sender>
         <ns0:Identifier Authority="EAN.UCC">4606038000003 </ns0:Identifier>
         <ns0:ContactInformation>
            <ns0:Contact/>
            <ns0:EmailAddress/>
            <ns0:FaxNumber/>
            <ns0:TelephoneNumber/>
            <ns0:ContactTypeIdentifier/>
         </ns0:ContactInformation>
      </ns0:Sender>
      <ns0:Receiver>
         <ns0:Identifier Authority="EAN.UCC">4605922999997 </ns0:Identifier>
         <ns0:ContactInformation>
            <ns0:Contact/>
            <ns0:EmailAddress/>
            <ns0:FaxNumber/>
            <ns0:TelephoneNumber/>
            <ns0:ContactTypeIdentifier/>
         </ns0:ContactInformation>
      </ns0:Receiver>
В нем несколько таких нейм-спейсов - ns0, ns1, ns2 и т.д.

Есть перечень полей, из которых мне надо считать значения, примерно такой:


/ns0:StandardBusinessDocument/ns0:StandardBusinessDocumentHeader/ns0:HeaderVersion
/ns0:StandardBusinessDocument/ns0:StandardBusinessDocumentHeader/ns0:Sender/ns0:Identifier
/ns0:StandardBusinessDocument/ns0:StandardBusinessDocumentHeader/ns0:Sender/ns0:Identifier/@Authority

Эти адреса помещены в столбец эксельки от 1 до 38 - как комментарий к коду ниже.

Есть код на VBA, который считывает адрес поля, находит его и выводит мне значение в этом поле.
А проблема в том, что код не хочет работать с пространствами имен. Выдает ошибку "Неидентифицированное пространство имен". Приходится убирать его ID и из перечня полей и из XML. Тогда все работает как надо.
Но как заставить VBA работать с нейм-спейсами в XML-ке?

Сам код ниже:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Dim clsXDoc As MSXML2.DOMDocument60
    
    Set clsXDoc = New MSXML2.DOMDocument60
    
    If clsXDoc.Load("Путь к файлу.xml") Then
        'Dim clsXNode As MSXML2.IXMLDOMNode
        
        For i = 1 To 38
        
        Set clsXNode = clsXDoc.SelectSingleNode(Sheets("Sheet1").Cells(i, 3).Value)
        
        If Not clsXNode Is Nothing Then
            Sheets("Sheet1").Cells(i, 1).Value = clsXNode.nodeName & "=" & clsXNode.Text
         Else
        Sheets("Sheet1").Cells(i, 1).Value = "Нет такого поля!"
        End If
        
        Next i
        
    Else
        MsgBox "Нет такого файла!"
    End If
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.03.2012, 11:24
Ответы с готовыми решениями:

В чем разница между подключением пространства имен в начале файла и внутри другого пространства имен?
Привет! Есть свой класс: namespace MyNamespace { public class MyClass { }

XSLT. Удалить пространства имен из XML
Доброго времени суток, Форумчане! Имеется следующий XML-пакет (Листинг 1): Нужно отсечь лишнее, то, что помечено полужирным...

Работа в Qt с XML файлами имеющими пространства имен
Имеется простейший XML файл: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;Example xmlns=&quot;ab&quot; xmlns:ns1=&quot;abc&quot;...

10
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
23.03.2012, 12:03
В нем несколько таких нейм-спейсов - ns0, ns1, ns2 и т.д.
А это количество пространств имен заранее известно и фиксировано? Если да,
то можно написать цикл, который вместо нуля в подстроке 'ns0' будет поочередно подставлять 1, 2 и т.д. - надо только знать последний nsX - чему равно это X.

Пример для ns0...ns10
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    Dim clsXDoc As MSXML2.DOMDocument60
    Dim i As Long, j As Long
    
    Set clsXDoc = New MSXML2.DOMDocument60
    
    If clsXDoc.Load("Путь к файлу.xml") Then
        For j = 1 To 10
            For i = 1 To 38
                Set clsXNode = clsXDoc.SelectSingleNode(Replace(Sheets("Sheet1").Cells(i, 3).Value, "ns0", "ns" & j))
                
                If Not clsXNode Is Nothing Then
                    Sheets("Sheet1").Cells(i, 1).Value = clsXNode.nodeName & "=" & clsXNode.Text
                Else
                    Sheets("Sheet1").Cells(i, 1).Value = "Нет такого поля!"
                End If
            Next i
        Next j
    Else
        MsgBox "Нет такого файла!"
    End If
0
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 8
23.03.2012, 12:15  [ТС]
Да их всего 3 на самом-то деле. ns0, 1, 2
Вопрос у меня только в том, как подружить их с VBA - то есть сделать, чтобы он не ругался?
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
23.03.2012, 12:29
Ответ я тебе уже написал (кусок кода). Смотри выше. Там только поправь, чтобы j было от 0 до 2.
0
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 8
23.03.2012, 13:01  [ТС]
Да, безусловно спасибо. Но это немного не то, что мне нужно. Вероятно сам виноват, что вопрос неточно сформулировал.
VBA ругается на то, что неймспейсы вообще в принципе присутствуют. Приходится их убирать и из адресов и из XML-ки.
0
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 8
23.03.2012, 13:12  [ТС]
Вот собственно ошибка (картинка в аттаче):
Миниатюры
Пространства имен в XML  
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
23.03.2012, 13:26
Надо бы исследовать коллекцию
clsXDoc.namespaces
туда бы методом Add определить все три пространства имен и может все бы стало работать, кто знает..

Вы можете выложить файлы xls(x), xml для примера, чтобы можно было пробовать что-то делать макросом, экспериментировать с живым кодом, а не воображаемым?
1
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 8
23.03.2012, 15:39  [ТС]
Ну да, все так и есть. В xml-ке сами неймспейсы очень криво заданы в тегах, поэтому по факту они совсем другие. Добавил через .add - все заработало.
Спасибо!
0
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 8
26.03.2012, 12:18  [ТС]
UP темы. Все-таки не работает так как надо, потому что нельзя менять эти свойства у XML-ки (read-only).

Узнал, что такие вещи делаются через .SetProperty
Однако, ошибка (см. скриншот выше) все равно никуда не исчезла. Префиксы неймспейсов по-прежнему не распознана
Собственно, ошибка на 14-ю строчку приводит, которая ссылается на вот такую запись:

/ns0:StandardBusinessDocument/ns0:StandardBusinessDocumentHeader/ns0:HeaderVersion





Даю свой код, XML дать не получается - превосходит допустимый для вложений размер файла:

clsXDoc.setProperty "SelectionNamespaces",

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Dim clsXDoc As MSXML2.DOMDocument60
    Set clsXDoc = New MSXML2.DOMDocument60
 
    If clsXDoc.Load(" ..... \XML_Example.xml") Then
        'Dim clsXNode As MSXML2.IXMLDOMNode
 
        clsXDoc.setProperty "SelectionLanguage", "XPath"
        clsXDoc.setProperty "SelectionNamespaces", "xmlns:ns0='http://www.unece.org/cefact/namespaces/SBDH'"
        clsXDoc.setProperty "SelectionNamespaces", "xmlns:ns1='urn:ean.ucc:2'"
        clsXDoc.setProperty "SelectionNamespaces", "xmlns:ns2='urn:ean.ucc:order:2'"
        
        For i = 1 To 38
        
        Set clsXNode = clsXDoc.SelectSingleNode(Sheets("Sheet1").Cells(i, 3).Value)
        
        If Not clsXNode Is Nothing Then
            Sheets("Sheet1").Cells(i, 1).Value = clsXNode.nodeName & "=" & clsXNode.Text
         Else
        Sheets("Sheet1").Cells(i, 1).Value = "Нет такой строки!"
        End If
        
        Next i
 
    Else
        MsgBox "Ошибка загрузки файла!"
    End If
0
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 8
26.03.2012, 12:25  [ТС]
Вот что в неймспейсах документа при загрузке содержится:
Миниатюры
Пространства имен в XML  
0
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 8
26.03.2012, 14:59  [ТС]
Собственно, вопрос - что я сейчас-то делаю не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.03.2012, 14:59
Помогаю со студенческими работами здесь

Как запретить переименование пространства имен в xml?
Я обрабатываю xml документ c помощью lxml. Провожу поиск и замену значений тегов, но после сохранения происходит изменение пространства...

Имя типа или пространства имен отсутствует в пространстве имен
Подскажите решение проблемы. Целиком код:

Имя типа или пространства имен отсутствует в пространстве имён
Доброго времени суток. Делаю пример SportsStore из книги &quot;ASP.NET MVC 3 Framework с примерами на C# для профессионалов&quot;, Сандерс....

Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные?
Вот например namespace nms1 { int gh; } namespace nms2 { int gh;

Имя типа или пространства имен "ProtectedData" отсутствует в пространстве имен System.Security.Cryptography
Такая проблема, пытаюсь собрать проект , но дает ошибки : по идее, они должны идти в комплекте ... поискал в гугле, он он кидает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru