Main Content

XML 파일을 문서 객체 모델로 가져오기

matlab.io.xml.dom.Parser 객체 또는 xmlread 함수를 사용하여 DOM(문서 객체 모델) 문서 노드로 XML 파일을 가져올 수 있습니다.

matlab.io.xml.dom.Parser 클래스는 MAXP(MATLAB® API for XML Processing)에 속합니다. MAXP Parser 객체를 사용하여 XML 파일을 읽어 들일 때, 결과로 생성된 DOM 문서 노드는 matlab.io.xml.dom.Document 객체로 표현됩니다. Document 객체로 작업할 때 사용할 수 있는 클래스 목록은 matlab.io.xml.dom을 참조하십시오. MAXP 클래스를 사용할 때 Java® 소프트웨어는 필요하지 않습니다.

xmlread로 만든 DOM 문서 노드 객체로 작업하려면 JAXP(Java API for XML Processing)를 사용해야 합니다. JAXP 메서드와 속성이 나열된 목록은 https://docs.oracle.com/javase/7/docs/api에 있는 org.w3c.dom 패키지 설명을 참조하십시오.

XML 문서 객체 모델

문서 객체 모델에서 XML 파일의 각 항목은 한 노드에 대응됩니다. 노드를 만들고 이에 액세스하는 데 사용하는 속성과 메서드는 World Wide Web 컨소시엄에서 설정한 표준을 따릅니다.

다음 샘플 XML 파일을 예로 들어보겠습니다.

<productinfo>

<!-- This is a sample info.xml file. -->

<list>

<listitem>
<label color="blue">Import Wizard</label>
<callback>uiimport</callback>
<icon>ApplicationIcon.GENERIC_GUI</icon>
</listitem>

<listitem>
<label color="red">Profiler</label>
<callback>profile viewer</callback>
<icon>ApplicationIcon.PROFILER</icon>
</listitem>

</list>
</productinfo>

파일의 정보는 다음 유형의 DOM 노드에 매핑됩니다.

  • 요소 노드 — 태그 이름에 해당합니다. info.xml 파일에서는 아래와 같은 태그가 요소 노드에 해당됩니다.

    • productinfo

    • list

    • listitem

    • label

    • callback

    • icon

    이 경우 list 요소는 자식 노드인 listitem 요소의 부모입니다. productinfo 요소는 루트 요소 노드입니다.

  • 텍스트 노드 — 요소 노드와 연관된 값을 포함합니다. 모든 텍스트 노드는 요소 노드의 자식입니다. 예를 들어, Import Wizard 텍스트 노드는 첫 번째 label 요소 노드의 자식입니다.

  • 특성 노드 — 요소 노드와 연관된 이름과 값 쌍을 포함합니다. 예를 들어, 첫 번째 label 요소 노드에서 color는 특성의 이름이고 blue는 이 특성의 값입니다. 특성 노드는 어떤 노드의 부모나 자식이 아닙니다.

  • 주석 노드<!--Sample comment-->의 형식으로 파일의 추가 텍스트를 포함합니다.

  • 문서 노드 — 전체 파일에 해당합니다. 문서 노드에서 메서드를 사용하여 새로운 요소 노드, 텍스트 노드, 특성 노드 또는 주석 노드를 만들 수 있습니다.

MAXP 구문 분석기를 사용하여 XML 파일 읽어 들이기

이 예제에서는 matlab.io.xml.dom.Parser 객체를 사용하여 info.xml 파일을 matlab.io.xml.dom.Document 노드로 읽어 들입니다. 파일에는 몇 가지 listitem 요소가 포함되어 있습니다. 각 listitem 요소에는 label 요소와 callback 요소가 포함되어 있습니다. 이 예제에서는 MAXP 메서드를 사용하여, 텍스트 내용이 Plot Toolslabel에 대응하는 callback 요소의 텍스트 내용을 찾습니다.

파일을 Document 객체로 읽어 들입니다.

infoFile = fullfile(matlabroot,'toolbox/matlab/general/info.xml');
infoLabel = 'Plot Tools';
infoCbk = '';
itemFound = false;

import matlab.io.xml.dom.*
xDoc = parseFile(Parser,infoFile);

matlab.io.xml.dom.NodeList 객체를 반환하는 getElementsByTagName 메서드를 호출하여 모든 listitem 요소를 찾습니다.

allListItems = getElementsByTagName(xDoc,'listitem');

listitem 요소에 대해 label 요소의 텍스트와 Plot Tools를 비교합니다. 맞는 레이블을 찾으면 callback 텍스트를 가져옵니다. NodeList 객체의 요소에 액세스하려면 1부터 시작하는 인덱싱 방식의 node 메서드를 사용하십시오. 또는 0부터 시작하는 인덱싱 방식의 item 메서드를 사용해도 됩니다.

length = allListItems.Length;
for i=1:length

    thisListItem = node(allListItems,i);
    childNode = getFirstChild(thisListItem);

    while ~isempty(childNode)
        %Filter out text, comments, and processing instructions.

        if isa(childNode,'matlab.io.xml.dom.Element')
            %Assume that each element has a single Text child
            
            childText = getData(getFirstChild(childNode));

            switch getTagName(childNode)
                case 'label'
                    itemFound = strcmp(childText,infoLabel);
                case 'callback'
                    infoCbk = childText;
            end
        end
        childNode = getNextSibling(childNode);
    end
    if itemFound
        break
    else
        infoCbk = '';
    end
end

결과를 표시합니다.

fprintf('Item "%s" has a callback of "%s".\n', infoLabel,infoCbk);
Item "Plot Tools" has a callback of "figure; plottools".

xmlread를 사용하여 XML 파일 읽어 들이기

이 예제에서는 xmlread를 사용하여 info.xml 파일을 DOM 문서 노드로 읽어 들인 후 Java API for XML Processing 메서드를 사용하여 텍스트 내용이 Plot Toolslabel에 대응하는 callback 요소의 텍스트 내용을 찾습니다.

infoFile = fullfile(matlabroot,'toolbox/matlab/general/info.xml');
infoLabel = 'Plot Tools';
infoCbk = '';
itemFound = false;

xDoc = xmlread(infoFile);

allListItems = getElementsByTagName(xDoc,'listitem');

%The item list index is zero-based.
length = allListItems.getLength-1;
for i=0:length

    thisListItem = item(allListItems,i);
    childNode = getFirstChild(thisListItem);

    while ~isempty(childNode)
        %Filter out text, comments, and processing instructions.

        if childNode.getNodeType == childNode.ELEMENT_NODE
            %Assume that each element has a single org.w3c.dom.Text child

            childText = char(childNode.getFirstChild.getData);

            switch char(childNode.getTagName)
                case 'label'
                    itemFound = strcmp(childText,infoLabel);
                case 'callback'
                    infoCbk = childText;
            end
        end
        childNode = getNextSibling(childNode);
    end
    if itemFound
        break
    else
        infoCbk = '';
    end
end
fprintf('Item "%s" has a callback of "%s".\n', infoLabel,infoCbk);
Item "Plot Tools" has a callback of "figure; plottools".

참고 항목

|

관련 항목

외부 웹사이트