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 Tools
인 label
에 대응하는 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 Tools
인 label
에 대응하는 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".
참고 항목
matlab.io.xml.dom.Document
| xmlread