2012-03-21 67 views
1

我从表格中创建一个新的XML文件。问题是我不希望根节点的子节点具有属性xmlns。这会自动发生,并且不正确。如果我在根元素上有属性,则无论它如何到达,都会将其放入其子节点中。我怎样才能摆脱它?MS动态导航XML名称空间自动设置

一个

当地人 名数据类型子类型长度

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 2012-11-07 15:09:23

回答

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

感谢您的答案。这是真的没有办法摆脱它!但我找到了一个解决方法,至少允许文件的valiadion。从根中添加默认名称空间允许文档有效。

<?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);