<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=GnuSmalltalkUsersGuide%3AAdditionalChapter8_2</id>
	<title>GnuSmalltalkUsersGuide:AdditionalChapter8 2 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=GnuSmalltalkUsersGuide%3AAdditionalChapter8_2"/>
	<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=GnuSmalltalkUsersGuide:AdditionalChapter8_2&amp;action=history"/>
	<updated>2026-05-01T17:06:13Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://trans.onionmixer.net/wiki/index.php?title=GnuSmalltalkUsersGuide:AdditionalChapter8_2&amp;diff=4341&amp;oldid=prev</id>
		<title>Onionmixer: gsug XML 빌드하기 페이지 추가</title>
		<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=GnuSmalltalkUsersGuide:AdditionalChapter8_2&amp;diff=4341&amp;oldid=prev"/>
		<updated>2014-02-01T10:36:21Z</updated>

		<summary type="html">&lt;p&gt;gsug XML 빌드하기 페이지 추가&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;;XML 빌드하기&lt;br /&gt;
&lt;br /&gt;
==XML 빌드하기==&lt;br /&gt;
&lt;br /&gt;
향후에 무언가가 XML 문서를 처리하지 않는다면 굳이 문서를 빌드해야 할 이유가 없다. 대부분의 XML 툴은 XMl 문서에 문서 루트가 있도록 요한다. 루트는 다른 모든 태그가 존재하는 내부의 태그, 바꿔 말하자면 다른 모든 노드들이 내려오는 단일 부모 노드이다. 필자의 경우 한 동료가 Sablot의 sabcmd를 이용해 내 서버로부터 XML을 HTML으로 변환하고자 했다. 그렇다면 루트가 있는 문서로 시작해보자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
replyDoc := XML Document new.&lt;br /&gt;
replyDoc addNode: (XML Element tag: &amp;#039;response&amp;#039;).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
좀 더 복잡한 것을 시작하기 전에 우리의 새 XML 문서를 갖고 놀 수 있겠다. 누군가에게 XML 텍스트를 전송하거나 이를 파일로 작성하길 원한다고 가정하면 우선 이를 문자열로 캡처(capture)하길 원할 것이다. 설사 문자열로 먼저 캡처를 원하지 않는다 하더라도 이번 예제에서는 그렇게 할 것이다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
replyStream := String new writeStream.&lt;br /&gt;
replyDoc printOn: replyStream.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
replyStream (replyStream contents) 내용을 살펴보았다면 아래가 보일 것이다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;response/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
빈 태그의 모습이다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 우리의 XML 문서에 텍스트를 추가해보자. 아래와 같은 모양이 되길 원한다고 치자:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;response&amp;gt;Hello, world!&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이를 빌드하려면 두 개의 노드가 새 XML 문서로 추가될 필요가 있다. 첫 번째 노드(또는 요소)는 response로 명명된다. 두 번째 노드는 첫 번째 노드에 텍스트를 추가한다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
replyDoc := XML Document new.&lt;br /&gt;
replyDoc addNode: (XML Element tag: response). &amp;quot;our root node&amp;quot;&lt;br /&gt;
replyDoc root addNode: (XML Text text: &amp;#039;Hello, world!&amp;#039;).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
또 다른 작성 방법으로 추가하기 전에 전체 노드를 생성하는 방법이 있는데 필자 또한 이를 이용했다. 이는 할당자(assignment)의 모양을 줄여줄 뿐만 아니라 #addNode: 메시지를 요소로 cascading하기 위한 템플릿을 제시하는데, 중요한 XML을 빌드할 경우 아래를 많이 이용할 것이다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
replyDoc := XML Document new.&lt;br /&gt;
replyDoc addNode: (&lt;br /&gt;
    (XML Element tag: response)&lt;br /&gt;
        addNode: (XML Text text: &amp;#039;Hello, world!&amp;#039;)&lt;br /&gt;
).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
앰퍼샌드(&amp;amp;)가 포함된 텍스트 노드를 실수로 추가하는 일이 절대로 없도록 보장하지 않는 이상 XML 파서를 지나치도록 벗어나야(escape) 할 것이다. 필자는 텍스트 노드를 추가할 때마다 벗어나는 방법을 이용했다. 이를 수월하게 만들기 위해 내 객체들의 추상적 슈퍼클래스에 (다시) 메서드를 생성했다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
asXMLElement: tag value: aValue&lt;br /&gt;
    | n |&lt;br /&gt;
    &lt;br /&gt;
    n := XML Element tag: tag.&lt;br /&gt;
    aValue isNil ifFalse: [&lt;br /&gt;
            n addNode: (XML Text&lt;br /&gt;
    text: (aValue displayString copyReplaceAll: &amp;#039;&amp;amp;&amp;#039; with: &amp;#039;&amp;amp;amp;&amp;#039;))].&lt;br /&gt;
    ^n&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
self asXMLElement: &amp;#039;sometagname&amp;#039; value: anInstanceVariable 로의 호출이 필자의 코드에 지저분하게 포함되어 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
속성을 문서에 추가하는 작업은 다행히도 접근하는 작업보다 수월하다. 위의 문서로 속성을 추가하길 원한다면 하나의 문으로 가능하다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
replyDoc root addAttribute: (XML Attribute name: &amp;#039;isExample&amp;#039; value: &amp;#039;yes&amp;#039;).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 우리 XML은 아래와 같은 모습일 것이다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;response isExample=&amp;quot;yes&amp;quot;&amp;gt;Hello, world!&amp;lt;/response&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:GnuSmalltalkUsersGuide]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
	</entry>
</feed>