2012-02-28 3 views
7

MATLAB을 사용하여 XML 문자열을 구문 분석해야합니다 (주의 : 파일 I/O가 없으므로 파일에 문자열을 쓰고 읽지 않으려 고합니다). HTTP 연결에서 문자열을 받고 구문 분석이 매우 빨라야합니다. 나는 전체 문자열에서 특정 태그의 값을 읽는 것에 주로 관심이있다.MATLAB에서 XML 문자열 구문 분석

그물은 regexp로 XML을 파싱하는 데 대한 사후 위협으로 가득차 있기 때문에 나는 아직 그것에 들어가고 싶지 않았다. 나는 MATLAB이 완벽한 자바 통합을 가지고 있음을 알고 있지만, 나는 자바에 익숙하지 않다. XML로부터 매우 빠르게 특정 값을 얻는 빠른 방법이 있습니까?

예를 들어 아래의이 문자열에서 '볼륨'정보를 가져 와서 이것을 변수에 쓰고 싶습니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 


<root> 
    <volume>256</volume> 
    <length>0</length> 
    <time>0</time> 
    <state>stop</state> 
    .... 
+0

창을 사용하고 있습니까? 그렇다면 .NET 솔루션을 제공 할 수 있습니다. –

답변

1

, XML을 다루는 xmlreadxmlwrite 등을 위해 전체 class of functions을있다. 그것들은 당신의 문제에 매우 유용해야합니다.

그것은 가치가 무엇인지에 대한
+2

하지만 그는 명시 적으로 그는 파일을 다루고 싶지 않다고 말했습니다. –

7

은 아래 중간 파일을 작성하지 않고, 필요한 작업을 수행 할 수있는 matlab에 실행 자바 코드 : 응용 프로그램이 허용하는 경우 대안으로

%An XML formatted string 
strXml = [... 
    '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>' char(10)... 
    '<root>' char(10) ... 
    ' <volume>256</volume>' char(10) ... 
    ' <length>0</length>' char(10) ... 
    ' <time>0</time>' char(10) ... 
    ' <state>stop</state>' char(10) ... 
    '</root>' ]; 

%"simple" java code to create a document from said string 
xmlDocument = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder.parse(java.io.StringBufferInputStream(strXml)); 

%"intuitive" methods to explore the xmlDocument 
nodeList = xmlDocument.getElementsByTagName('volume'); 
numberOfNodes = nodeList.getLength(); 

firstNode = nodeList.item(0); 
firstNodeContent = firstNode.getTextContent; 

disp(firstNodeContent); %Returns '256' 

, 고려 URL을 XML 구문 분석기로 직접 전달합니다. 테스트되지 않은 자바 코드는 아래에 있지만 Matlab에 내장 된 xslt 함수도 열립니다.

xmlDocument = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder.parse('URL_AS_A_STRING_HERE'); 

문서 here. "javax.xml.parsers"패키지에서 시작하십시오.

1

Matlab의 API에 익숙하지 않지만 XML 스트림에서 특정 값만 가져 오려면 Pursuit에서 설명한 DOM 메소드를 사용하는 것이 가장 많은 시간과 메모리를 소비한다는 점을 지적합니다. HTTP 연결.

STAX는 Java에서 가장 빠른 구문 분석 방법을 제공하지만 API를 사용하면 Java에 익숙하지 않은 사용자도 특히 다루기 힘들 수 있습니다. 은 Java에서 STAX 파싱의 극히 얇은 추상화 ontop입니다 (면책 조항 : 필자는 저자입니다). 원하는 요소에 대한 경로를 정의한 다음 파서에 스트림을 제공 할 수 있습니다 (이 경우 HTTP 스트림).) 그리고 당신을위한 모든 가치를 끌어 낸다.

// Create /root/state rule 
IRule stateRule = new DefaultRule(Type.CHARACTER, "/root/state") { 
    @Override 
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) { 
     System.out.println("State is: " + text); 
    } 
} 

// Create /root/volume rule 
IRule volRule = new DefaultRule(Type.CHARACTER, "/state/volume") { 
    @Override 
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) { 
     System.out.println("Volume is: " + text); 
    } 
} 

// Create the parser with the given rules 
XMLParser parser = new XMLParser(stateRule, volRule); 

당신은 할 수 있습니다 :

예를 들어

,의 당신이 실제 자바는 다음과 같이 보일 것입니다 당신이 게시 된 예제 XML 밖으로/루트/상태/루트/볼륨 값을 원하는 가정 해 봅시다 당신이 당신의 HTTP 연결에서 스트림을 처리 할 때 프로그램에 대한 그 초기화 모두는 같은 것을 할 것, 나중에 어떤 시점에서 다음 시작 :

parser.parser(httpConnection.getOutputStream()); 

등을; 파서가 HTTP 연결의 문자 스트림을 통해 실행될 때 규칙에 정의한 모든 처리기 코드가 호출됩니다.

내가 언급했듯이 Matlab에 익숙하지 않고이 코드를 "Matlab-i-fy"로 바꾸는 적절한 방법을 모르지만 첫 번째 예제에서와 같이 Java API를 사용할 수도 있습니다 직접적으로이 솔루션은 DOM 접근 방식보다 중요하다면 파싱에 더 빠른 메모리와 더 적은 메모리를 사용합니다.