Имя: Пароль:
1C
1C 7.7
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));

КонецЦикла;
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс