|
v7: Как указать Namespace при выборе тегов в хмл | ☑ | ||
---|---|---|---|---|
0
самолет
13.12.16
✎
09:28
|
Есть хмл у которого в корневовом теге указано пространство имен
<Bundle xmlns="http://hl7.org/fhir"> <type value="searchset"/> <entry> <resource> <MedicationPrescription> <id value="777"/> </MedicationPrescription> <MedicationPrescription> <id value="888"/> </MedicationPrescription> </resource> </entry> </Bundle> Мне нужно отобрать все MedicationPrescription делаю так но в ответ пустота: XML= CreateObject("MSXML2.DOMDocument.6.0"); XML.Load("d:\файл.xml"); all = XML.selectNodes("//MedicationPrescription"); length = all.length; Для i = 0 по length - 1 цикл Попытка Данные = all.item(i).selectSingleNode("id").getAttribute("value"); исключение Сообщить("Не получены данные","!!!"); КонецПопытки; КонецЦикла; проблема я понимаю в том что в корне указано xmlns="http://hl7.org/fhir", но не понимаю как его явно указать пространство имен при выборе тега MedicationPrescription чтобы вернуло все... |
|||
1
igork1966
13.12.16
✎
09:39
|
(0) ну можно сделать финт ушами: "//*[local-name()='MedicationPrescription']"
|
|||
2
igork1966
13.12.16
✎
09:44
|
(1) + лень искать доки по MSXML2.DOMDocument.6.0
но обычно можно указать в конструкторе пространство имен |
|||
3
Serginio1
13.12.16
✎
09:55
|
||||
4
Serginio1
13.12.16
✎
09:56
|
||||
5
Serginio1
13.12.16
✎
10:34
|
Пример из http://stackoverflow.com/questions/13040926/parsing-xml-with-namespaces-c-sharp
Можно переписать так. Путь="c:\tmp\ТестNameSpace.xml"; врап=новый COMОбъект("NetObjectToIDispatch45"); // Для 7.7 установим флаг семерки, так как не все СОМ типы понимает врап.УстЭтоСемерка(); ?XNamespace=Врап.ПолучитьТипИзСборки("System.Xml.Linq.XNamespace","System.Xml.Linq.dll"); ?ns2 =XNamespace.op_Implicit("http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd"); ?Сообщить(ns2 .NamespaceName); ?ДанныеПоиска=XNamespace.op_Addition(ns2,"ItemDimensions"); ? ?XDocument=Врап.ПолучитьТип("System.Xml.Linq.XDocument"); ?doc= XDocument.Load(Путь); ? Данные= doc.Document.Descendants(ДанныеПоиска); //.FirstOrDefault().Element(ns2 + "Height").Value; СтрПоискаHeight=XNamespace.op_Addition(ns2 ,"Height"); Для каждого стр из Данные Цикл Сообщить(стр.Element(СтрПоискаHeight).Value); КонецЦикла; |
|||
6
самолет
13.12.16
✎
10:34
|
сделал пока по тупому
nsmgr = "xmlns=""http://hl7.org/fhir"""; text = стрЗаменить(text,nsmgr,""); XML = CreateObject("MSXML2.DOMDocument.6.0"); XML.loadXML(text) (0) ну можно сделать финт ушами: "//*[local-name()='MedicationPrescription']" при выборе так не работает Данные = all.item(i).selectSingleNode("id").getAttribute("value"); пусто возвращается (3) и (4) пока не разобрался на скорую руку как создавать XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); manager.AddNamespace("ord", "urn:id"); |
|||
7
самолет
13.12.16
✎
10:35
|
text это хмл
|
|||
8
Serginio1
13.12.16
✎
10:39
|
XmlNamespaceManager =Врап.ПолучитьТипИзСборки("System.Xml.XmlNamespaceManager,"System.Xml.dll");
manager = Врап.СоздатьОбъект(XmlNamespaceManager,doc.NameTable); |
|||
9
Serginio1
13.12.16
✎
10:41
|
Да для семерки нет Для Каждого
Пройтись можно так Перечислимый=Врап.ПолучитьИнтерфейс(Данные,"IEnumerable"); Перечислитель=Перечислимый.GetEnumerator(); // На всякий случай приведем к Интерфейсу IEnumerator Перечислитель=Врап.ПолучитьИнтерфейс(Перечислитель,"IEnumerator"); // Теперь можем пройтись по коллекции Пока Перечислитель.MoveNext()<>0 Цикл // Врап.ВСтроку вывоит строковое представление всех типов в том числе числовые, строки, неопределено Сообщить(Врап.ВСтроку(Перечислитель.Current)); КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |