2012-06-21 7 views
8

나는 MSXML2.DomDocument의 인스턴스를 가지고있다.들여 쓰기가있는 MSXML2.DomDocument를 저장하려면 어떻게해야합니까? (나는 MXXMLWriter를 사용한다고 생각한다.)

들여 쓰기하여 저장합니다.

이 코드는 작동하지만, 들여 쓰기하지 않습니다

var dom = new ActiveXObject("MSXML2.DomDocument"); 
// fiddle with dom here 
dom.save(filename); 

은 내가 들여 쓰기를 주입하는 MXXMLWriter 개체를 사용할 수 있다고 생각합니다.

어떻게?

답변

6

이렇게해야합니다.

function saveDomWithIndent(dom, filename) { 
    var writer = new ActiveXObject("MSXML2.MXXMLWriter"), 
     reader = new ActiveXObject("MSXML2.SAXXMLReader"), 
     fso = new ActiveXObject("Scripting.FileSystemObject"), 
     textStream = fso.CreateTextFile(filename, true); 
    writer.indent = true; 
    writer.omitXMLDeclaration = true; 
    reader.contentHandler = writer; 
    reader.parse(dom); 
    textStream.Write(writer.output); 
    textStream.Close(); 
} 

이처럼 사용

var root, node, newnode, 
    dom = new ActiveXObject("MSXML2.DOMDocument.6.0"); 
dom.async = false; 
dom.resolveExternals = false; 
dom.load(fullpath); 
root = dom.documentElement; 
node = root.selectSingleNode("/root/node1"); 
if (node !== null) { 
    newnode = dom.createElement('node2'); 
    newnode.text = "hello"; 
    root.appendChild(newnode); 
    saveDomWithIndent(dom, fullpath); 
} 

내가 들여 쓰기 레벨을 조정하는 방법을 알아낼 수 없었다. 으로 항상 들여 씁니다.

1

xml 출력을 미리 인증하는 다른 방법이 있습니다. 사용자가 들여 쓰기 레벨을 수동으로 조정할 수도 있습니다 : XSL. 당신이 XSL을 사용하지 않으려면

var adSaveCreateOverWrite = 2 
var Indent = new ActiveXObject("MSXML2.DomDocument"); 
    Indent.async = false; 
    Indent.resolveExternals = false; 
    Indent.load("indent.xsl"); 
var Doc = new ActiveXObject("MSXML2.DomDocument"); 
    Doc.async = false; 
    Doc.resolveExternals = false; 
    Doc.load("dirty.xml"); 
with(new ActiveXObject("ADODB.Stream")){ 
    Charset = "utf-8"; 
    Open(); 
    WriteText(Doc.transformNode(Indent)); 
    SaveToFile("pretty.xml", adSaveCreateOverWrite); 
    Close(); 
} 

indent.xsl

<?xml version="1.0" encoding="ISO-8859-15"?> 
<!-- http://x443.wordpress.com/2011/page/34/ --> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml"/> 

    <xsl:template match="@*"> 
    <xsl:copy/> 
    </xsl:template> 

    <xsl:template match="text()"> 
    <xsl:value-of select="normalize-space(.)" /> 
    </xsl:template> 

    <xsl:template match="*"> 
    <xsl:param name="indent" select="''"/> 
    <xsl:text>&#xa;</xsl:text> 
    <xsl:value-of select="$indent" /> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|*|text()"> 
     <xsl:with-param name="indent" select="concat($indent, ' ')"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    <xsl:if test="count(../*)>0 and ../*[last()]=."> 
     <xsl:text>&#xa;</xsl:text> 
     <xsl:value-of select="substring($indent,3)" /> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 
+0

좋은 :

Dim objDom As DOMDocument Set objDom = CreateObject("MSXML2.DOMDocument") 

다음, objDom.append로 문서를 만들 문자열 플레이는 (내 XML은 수 있었다). 이것은 followon 질문에 이르게합니다 - 들여 쓰기를 수행하기 위해 msxml6.dll에 포함 된 XSL 시트 중 하나 인 내장 XSL을 사용할 수 있습니까? 프로그래밍 방식으로 XSL을 추출한 다음 적용하는 것이 필요할 것이라고 생각합니다. – Cheeso

+0

@Cheeso 죄송 합니다만, 무슨 뜻인지 정확히 이해하지 못했습니다. 사실, 나는'FreeThreadedDomDocument' 인스턴스를 Classic ASP로 응용 프로그램 범위 ('Application_OnStart' 이벤트에서 초기화 됨)에 저장된 정적 객체로 사용하고 있습니다. 이렇게하면 각 변환에 대해 반복되는 트랜잭션을 방지 할 수 있습니다. –

+0

이 글은 지금은 부실한 코멘트 스트림이라는 것을 알고 있지만, 이전에 내가 의미했던 것을 설명하기 위해 : msxml에 적어도 하나의 내장 XSLT가 포함되어 있다고 생각합니다. http://stackoverflow.com/questions/9463402/default-xml-stylesheet-in-chrome 참조하십시오. 내가 묻는 이유는, 내 자신의 사용자 지정 시트를 포함하는 대신 내장 된 xslt를 사용할 수 있다면 더 간단 할 것입니다. – Cheeso

-1

, 당신은 단지 vbcrlfs를 삽입 할 수 있습니다. ">"다음에 숫자가 오는 경우를 제외하고 모든 ">"는 vbcrlf를 따라야합니다. 그런 다음 해당 문자열에서 새 XML 파일을 만듭니다. 이제는 새로운 줄과 들여 쓰기가 있습니다. MSACCESS VBA :

ss = objectDom.XML 
For i = 1 To Len(ss) 
c = Mid(ss, i, 1) 
    If InStr(1, Mid(ss, i, 1), ">") > 0 Then 
     a = Asc(Mid(ss, i + 1, 1)) 
     If a < 48 Or a > 57 Then 
      ss1 = Mid(ss, 1, i) 
      ss2 = Mid(ss, i + 1, Len(ss)) 
      ss = Mid(ss, 1, i) & vbCrLf & Mid(ss, i + 1, Len(ss)) 
     End If 
    End If 

Next i 

objDom.loadXML ss 
objDom.Save (file_path) 
+0

질문은 js (var vs dim) ... vba에서 옵션을 명시 적으로 사용하는 것을 고려합니다. 다음은 나에게 도움이되었다. 누군가 다른 사람이 그것을 원할 경우를 대비해서 : http://www.vb-helper.com/howto_formatted_xml_document.html –