Пространство имен XML MS Dynamics NAV устанавливается автоматически

Я создаю новый XML-файл из таблицы. Проблема в том, что я не хочу, чтобы дочерние элементы корневого узла имели атрибут xmlns. Это происходит автоматически и неправильно. Если у меня есть атрибут корневого элемента, независимо от того, как он туда попадает, он помещает его в свои дочерние узлы. Как мне от этого избавиться?

A

Локальные имена Имя Тип данных Подтип Длина

L_DataXML Automation 'Microsoft XML, v6.0'.DOMDocument60 
L_XMLElement Automation 'Microsoft XML, v6.0'.IXMLDOMElement 
L_XMLAttribute Automation 'Microsoft XML, v6.0'.IXMLDOMAttribute 
L_XMLNode Automation 'Microsoft XML, v6.0'.IXMLDOMNode 
L_XMLOrderHeader Automation 'Microsoft XML, v6.0'.IXMLDOMNode 
L_XMLOrderItemList Automation 'Microsoft XML, v6.0'.IXMLDOMNode 
L_XMLOrderSummary Automation 'Microsoft XML, v6.0'.IXMLDOMNode 

КОД C / AL

L_DataXML.loadXML('<ORDER xmlns="test"/>');

L_XMLNode := L_DataXML.documentElement;

L_XMLOrderHeader := L_DataXML.createNode(1,'ORDER_HEADER','');
L_XMLNode.appendChild(L_XMLOrderHeader);

XML

<?xml version="1.0"?>
<ORDER xmlns="test">
    <ORDER_HEADER xmlns=""/>
</ORDER>

person peshkatari    schedule 21.03.2012    source источник
comment
Обратите внимание, что Microsoft есть статья базы знаний по этой конкретной проблеме.   -  person eykanal    schedule 07.11.2012


Ответы (3)


У меня тоже была эта проблема некоторое время назад. Unforunatley, вы никак не можете предотвратить это с помощью XMLDOM. Мое обходное решение состояло в том, чтобы создать XML-файл с ошибкой, загрузить его в переменную bigtext и просмотреть его, стирая xmlns = ""

Код:

XMLFile.TEXTMODE(FALSE);
XMLFile.OPEN(SavePath);
XMLFile.CREATEINSTREAM(InStream);
InputText.READ(InStream);
XMLFile.CLOSE;

TextToFind := 'xmlns=""';
TextPos := InputText.TEXTPOS(TextToFind);
WHILE TextPos <> 0 DO BEGIN
  InputText.GETSUBTEXT(SubText, 1, TextPos - 1);
  OutputText.ADDTEXT(SubText);
  InputText.GETSUBTEXT(InputText, TextPos + STRLEN(TextToFind));
  TextPos := InputText.TEXTPOS(TextToFind);
END;
OutputText.ADDTEXT(InputText);

XMLFile.TEXTMODE(FALSE);
XMLFile.CREATE(SavePath);
XMLFile.CREATEOUTSTREAM(OutStream);
OutputText.WRITE(OutStream);
XMLFile.CLOSE;

Переменные

Name    DataType    Subtype Length
XMLFile File        
InStream    InStream        
OutStream   OutStream       
InputText   BigText     
OutputText  BigText     
SubText BigText     
TextPos Integer     
TextToFind  Text        30
SavePath    Text        1024

Надеюсь, поможет

person Phil    schedule 22.03.2012

Спасибо за ответ. Верно, от этого никак не избавиться! Но я нашел обходной путь, чтобы разрешить хотя бы валиадион файла. Добавление пространства имен по умолчанию из корня позволяет документу быть действительным.

<?xml version="1.0"?>
<ORDER xmlns="test">
    <ORDER_HEADER xmlns="test"/>
</ORDER>

другая проблема, с которой может столкнуться кто-то другой, - это второе пространство имен

<?xml version="1.0"?>
<ORDER xmlns="test" xmlns:second="second-test">
    <ORDER_HEADER xmlns="test">
          <second:TAG/>
    </ORDER_HEADER>
</ORDER>

сначала это приводит к ошибке, потому что не находит второе пространство имен. Просто добавьте URI пространства имен в AddFunciton, и он больше не будет жаловаться.

Ваше здоровье

person peshkatari    schedule 26.03.2012

при использовании метода createNode используйте namespaceURI из родительского узла. вероятно, должно работать, если вы измените на L_XMLOrderHeader: = L_DataXML.createNode (1, 'ORDER_HEADER', L_DataXML.namespaceURI);

person Tomas    schedule 25.09.2016