【问题标题】:Finding XML element, and reading attribute in Matlab在 Matlab 中查找 XML 元素并读取属性
【发布时间】:2014-08-20 15:04:59
【问题描述】:

我对 XML 很陌生,对 Matlab 中的 XML 也很陌生,但我正在尝试从(非常大的)XML 文件中读取属性。

文件如下所示:

<WorkGen>
 <experiment>
  <parameters>
  <exptid> abcd </exptid>
  <years> 400 </years>
  </parameters>
 </experiment>
 <experiment>
  <parameters>
  <exptid> wxyz </exptid>
  <years> 90 </years>
  </parameters>
 </experiment>
 ...
</WorkGen>

给定一个实验 ID (exptid),我希望能够使用 Matlab 找到年份的值。有人知道这样做的简单方法吗?


注意我尝试了XML2Struct,但在尝试读取 XML 时出现内存不足错误:

Java.lang.OutOfMemoryError:Java 堆空间 使用 org.apache.xerces.jaxp.DocumentBuilderImpl/parse 时出错 获取异常信息失败 xmlread 中的错误(第 98 行) parseResult = p.parse(fileName); xml2struct 中的错误(第 53 行) xDoc = xmlread(文件);

线程“TimerQueue”中的异常 线程“AWT-EventQueue-0”中的异常 java.lang.OutOfMemoryError:Java 堆空间 java.lang.OutOfMemoryError: Java 堆空间

【问题讨论】:

  • 什么是“非常大”?多少kb或mb?多少行?
  • 可能大约 100,000 大,所以不是很大,但足够大,以至于我在使用 XML2Struct 时会遇到内存问题
  • 请编辑您的问题以提供完整的错误消息 - 行号和所有内容。
  • 可以,但我认为没有必要通过 XML2Struct 来执行此操作,并且其他解决方案可能不会遇到相同的问题(同时更适用于那些不想下载Mathworks 文件交换的额外功能)。
  • 我知道的所有解决方案(包括XML2struct)都将基于Java 解析器。很高兴知道错误是来自解析器还是代码中的其他地方。您正在使用哪个 version 的 Matlab?它是 32 位 PC 版本吗?

标签: xml matlab xml-parsing


【解决方案1】:

试试这个:

findExptID = ' wxyz ';
findYear = '';

xDoc = xmlread('myfile.xml');

allListitems = xDoc.getElementsByTagName('experiment');

for k = 0:allListitems.getLength-1
   thisListitem = allListitems.item(k);

   % Get the label element. In this file, each
   % listitem contains only one label.
   thisList = thisListitem.getElementsByTagName('exptid');
   thisElement = thisList.item(0);

   % Check whether this is the label you want.
   % The text is in the first child node.
   if strcmp(thisElement.getFirstChild.getData, findExptID)
       thisList = thisListitem.getElementsByTagName('years');
       thisElement = thisList.item(0);
       findYear = char(thisElement.getFirstChild.getData);
       break;
   end

end

disp(findYear);

【讨论】:

  • 我需要将thisElement.getFirstChild.getData 更改为strtrim(char(thisElement.getFirstChild.getData)) 以避免出现空格问题。
【解决方案2】:

您的错误消息表明问题确实是由 Java 引起的(在 xmlread 内部,所以我不确定 @sclarke81 的解决方案是否有效)。这是处理 Matlab 的 Java 基础的典型错误。 Java 内存不足(堆空间)。您可以尝试增加它并查看是否可以解决这种情况 - MathWorks 的这篇博文详细介绍了如何检查堆大小以及如何根据首选项进行调整:

http://blogs.mathworks.com/community/2010/04/26/controlling-the-java-heap-size/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2013-02-04
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多