2012-03-21 3 views
1

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

Местные жители Имя DataType Подтип Длина

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> 
+0

Обратите внимание, что [Microsoft имеет статью базы знаний по этой точной проблеме] (http://support.microsoft.com/kb/828928). – eykanal

ответ

0

У меня была эта проблема тоже некоторое время назад. 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 

Надежда это помогает

0

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

<?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, и он больше не будет жаловаться.

Приветствия

0

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

Смежные вопросы