MATLAB

2012-02-28 18 views
7

में XML स्ट्रिंग को पार्स करना मुझे MATLAB के साथ एक XML स्ट्रिंग को पार्स करने की आवश्यकता है (सावधानी: फ़ाइल I/O के बिना, इसलिए मैं एक फ़ाइल में स्ट्रिंग लिखना नहीं चाहता हूं और फिर उन्हें पढ़ना चाहता हूं)। मैं एक HTTP कनेक्शन से स्ट्रिंग प्राप्त कर रहा हूं और पार्सिंग बहुत तेज होनी चाहिए। मैं पूरी स्ट्रिंगMATLAB

में कुछ टैग के मानों को पढ़ने के बारे में अधिक चिंतित हूं, नेट रेगेक्सपी के साथ एक्सएमएल को पार्स करने के बारे में मौत की धमकी से भरा है, इसलिए मैं अभी तक इसमें शामिल नहीं होना चाहता था। मुझे पता है कि MATLAB में निर्बाध जावा एकीकरण है लेकिन मैं बहुत जावा समझदार नहीं हूं। एक्सएमएल से कुछ मूल्यों को बहुत तेजी से प्राप्त करने का कोई त्वरित तरीका है?

उदाहरण के लिए मैं नीचे इस स्ट्रिंग से 'वॉल्यूम' जानकारी प्राप्त करना चाहता हूं और इसे एक चर में लिखना चाहता हूं।

<?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

वहाँ, एक्सएमएल के साथ काम कर xmlread और xmlwrite सहित के लिए एक पूरे 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' 

एक विकल्प के रूप में, यदि आपके आवेदन यह अनुमति देता है, पर विचार यूआरएल को सीधे अपने एक्सएमएल पार्सर में पास करना। अनचाहे जावा कोड नीचे है, लेकिन संभवत: xslt फ़ंक्शन में निर्मित मैटलैब भी खुलता है।

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

प्रलेखन here। "Javax.xml.parsers" पैकेज से शुरू करें।

1

मैं मैटलैब के एपीआई से बिल्कुल परिचित नहीं हूं, लेकिन मैं इंगित करता हूं कि पीछा द्वारा उल्लिखित डीओएम विधि का उपयोग करने में सबसे अधिक समय/स्मृति होगी यदि आप केवल उस XML स्ट्रीम से विशिष्ट मान चाहते हैं जो आप वापस प्राप्त कर रहे हैं HTTP कनेक्शन।

जबकि एसटीएक्स आपको जावा में सबसे तेज़ पार्सिंग दृष्टिकोण देगा, एपीआई का उपयोग करके अनावश्यक हो सकता है खासकर अगर आप जावा से परिचित नहीं हैं। आप SJXP का उपयोग कर सकते हैं जो जावा में एसटीएक्स पार्सिंग का एक बेहद पतला अमूर्त है (अस्वीकरण: मैं लेखक हूं) जो आपको इच्छित तत्वों के पथ को परिभाषित करने की अनुमति देता है, फिर आप पार्सर को एक स्ट्रीम देते हैं (इस मामले में आपकी 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); 

आप कर सकते हैं:

उदाहरण के लिए, मान लीजिए कि आप उदाहरण एक्सएमएल आप पोस्ट से बाहर/जड़/राज्य और/जड़/मात्रा मूल्यों चाहता था, वास्तविक जावा कुछ इस तरह दिखेगा जाने कार्यक्रम पर कि आरंभीकरण के सभी बाद में कुछ बिंदु पर तो शुरू जब आप अपने HTTP कनेक्शन से धारा कार्रवाई कर रहे हैं, तो आप की तरह कुछ करना होगा:

parser.parser(httpConnection.getOutputStream()); 

या की तरह; तो आपके नियमों में परिभाषित आपके सभी हैंडलर कोड को पार्सर HTTP कनेक्शन से वर्णों की धारा के माध्यम से चलाया जाएगा।

जैसा कि मैंने बताया है कि मैं Matlab से परिचित नहीं हूं और इस कोड को "Matlab-i-fy" के उचित तरीकों से नहीं जानता, लेकिन ऐसा लगता है कि आप पहले उदाहरण से जावा एपीआई का उपयोग कर सकते हैं सीधे इस मामले में यह समाधान तेजी से होगा और यदि डीओएम दृष्टिकोण से महत्वपूर्ण है तो पार्सिंग के लिए काफी कम स्मृति का उपयोग करें।