2012-02-28 4 views
7

Мне нужно разобрать XML-строку с помощью MATLAB (предостережение: без ввода/вывода файлов, поэтому я не хочу писать строку в файл, а затем читать). Я получаю строки из HTTP-соединения, и синтаксический анализ должен быть очень быстрым. Я в основном обеспокоен чтением значений определенных тегов во всей строкеРазбор XML-строк в MATLAB

В сети полно угроз смерти по поводу разбора XML с регулярным выражением, поэтому я еще не хотел этого делать. Я знаю, что MATLAB имеет встроенную интеграцию java, но я не очень разбираюсь в java. Есть ли быстрый способ получить определенные значения из 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

Там целая class of functions для работы с XML, в том числе и xmlreadxmlwrite. Это должно быть очень полезно для вашей проблемы.

+2

Но он прямо сказал, что не хочет иметь дело с файлами –

7

Для чего это стоит, ниже является Matlab исполняемого Java-код для выполнения требуемой задачи, без записи в промежуточный файл:

%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. Недопустимый код java ниже, но это, вероятно, также открывает встроенную функцию Matlab xslt.

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

Документация here. Начните с пакета javax.xml.parsers.

1

Я вообще не знаком с API-интерфейсом Matlab, но я хотел бы указать, что использование метода DOM, описанного в Pursuit, будет занимать больше времени/памяти, если вы хотите, чтобы определенные значения выводились из потока XML, который вы возвращаете HTTP-соединение.

Хотя STAX предоставит вам быстрый подход к анализу на Java, использование API может быть громоздким, особенно если вы не знакомы с Java. Вы можете использовать SJXP, который представляет собой чрезвычайно тонкую абстракцию на основе анализа STAX в Java (отказ от ответственности: я автор), который позволяет вам определять пути к элементам, которые вы хотите, затем вы даете парсеру поток (ваш HTTP-поток в этом случае), и он вытаскивает все значения для вас.

В качестве примера, предположим, что вы хотите значения/корень/состояние и/корень/объем выхода из примеров XML вы в курсе, фактическая Java будет выглядеть примерно так:

// 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» этого кода, но, похоже, из первого примера вы можете более или менее просто использовать Java API прямо в этом случае это решение будет быстрее и будет значительно меньше памяти для синтаксического анализа, если это важно, чем подход DOM.