2012-02-28 34 views
7

Tôi cần phải phân tích chuỗi XML bằng MATLAB (chú ý: không có tệp I/O, vì vậy tôi không muốn viết chuỗi đó vào tệp và sau đó đọc chúng). Tôi nhận được các chuỗi từ một kết nối HTTP và phân tích cú pháp phải rất nhanh. Tôi chủ yếu quan tâm đến việc đọc các giá trị của các thẻ nhất định trong toàn bộ chuỗiPhân tích chuỗi XML trong MATLAB

Mạng có đầy đủ các mối đe dọa về việc phân tích cú pháp XML với regexp vì vậy tôi chưa muốn tham gia vào đó. Tôi biết MATLAB có tích hợp java liền mạch nhưng tôi không hiểu rõ lắm về java. Có cách nào nhanh chóng để nhận các giá trị nhất định từ XML rất nhanh chóng không?

Ví dụ: tôi muốn lấy thông tin 'khối lượng' từ chuỗi này bên dưới và viết thông tin này vào một biến.

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


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

Bạn đang sử dụng cửa sổ? Nếu có, thì tôi có thể cung cấp cho bạn một giải pháp .NET. –

Trả lời

1

Có cả một class of functions để đối phó với xml, bao gồm xmlreadxmlwrite. Những thứ đó khá hữu ích cho vấn đề của bạn.

+2

Nhưng anh ta đã nói một cách rõ ràng anh ta không muốn đối phó với các tập tin –

7

Đối với những gì nó có giá trị, dưới đây là các mã Java thực thi Matlab để thực hiện các nhiệm vụ cần thiết, mà không cần viết một file trung gian:

%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' 

Là một thay thế, nếu ứng dụng của bạn cho phép nó, hãy xem xét chuyển URL trực tiếp vào trình phân tích cú pháp XML của bạn. Mã java chưa được kiểm tra ở bên dưới, nhưng điều đó cũng có thể mở ra chức năng xslt tích hợp sẵn của Matlab.

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

Tài liệu here. Bắt đầu từ gói "javax.xml.parsers".

1

Tôi không quen thuộc với API của Matlab, nhưng tôi chỉ ra rằng sử dụng phương pháp DOM do Pursuit vạch ra sẽ mất nhiều thời gian/bộ nhớ nhất nếu bạn chỉ muốn các giá trị cụ thể ra khỏi luồng XML mà bạn đang quay trở lại kết nối HTTP.

Trong khi STAX sẽ cung cấp cho bạn phương pháp phân tích cú pháp nhanh nhất trong Java, việc sử dụng API có thể khó sử dụng, đặc biệt nếu bạn không quen với Java. Bạn có thể sử dụng SJXP là một ontop trừu tượng của phân tích cú pháp STAX trong Java (từ chối trách nhiệm: Tôi là tác giả) cho phép bạn xác định đường dẫn đến các phần tử bạn muốn, sau đó bạn cung cấp cho trình phân tích cú pháp luồng (luồng HTTP của bạn trong trường hợp này)) và nó rút ra tất cả các giá trị cho bạn.

Như một ví dụ, giả sử bạn muốn các giá trị/root/tiểu bang và/root/lượng ra trong những ví dụ XML bạn đăng, Java thực tế sẽ giống như thế này:

// 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); 

Bạn có thể làm tất cả điều đó khởi tạo vào chương trình bắt đầu sau đó tại một số điểm sau khi bạn đang xử lý các luồng dữ liệu từ kết nối HTTP của bạn, bạn sẽ làm điều gì đó như:

parser.parser(httpConnection.getOutputStream()); 

hoặc tương tự; sau đó tất cả mã trình xử lý bạn đã xác định trong các quy tắc của bạn sẽ được gọi là trình phân tích cú pháp chạy qua luồng ký tự từ kết nối HTTP.

Như tôi đã đề cập, tôi không quen thuộc với Matlab và không biết các cách thích hợp để "Matlab-i-fy" mã này, nhưng có vẻ như từ ví dụ đầu tiên bạn có thể ít nhiều chỉ sử dụng API Java trực tiếp trong trường hợp này, giải pháp này sẽ nhanh hơn và sử dụng bộ nhớ ít hơn đáng kể để phân tích cú pháp nếu điều đó quan trọng hơn cách tiếp cận DOM.