【问题标题】:XML Parse - Issue with parsing text from specific Node [duplicate]XML Parse - 从特定节点解析文本的问题[重复]
【发布时间】:2017-11-06 13:03:17
【问题描述】:

在解析 XML 以从特定节点提取数据时遇到问题。我提到了Link1Link2Link3。请注意,我能够解析和获取以下 xml 文件中其他节点的数据,例如 id、order_id 等。但对于以下行/节点,无法提取 segment_id 和 instrument_id 的信息:

<trade segment_id="NSE-F&amp;O " instrument_id="NSE:INFRATEL17NOVFUT">

不确定 XML 文件的设置方式或我尝试为该特定节点提取数据的方式是否错误。希望我面临的具体问题很清楚。

XML 文件:

<contract_note version="0.1">
 <contracts>
  <contract>
   <id>CNT-17/18-5310750</id>
   <name>CONTRACT NOTE CUM BILL</name>
   <description>None</description>
   <timestamp>2017-11-01</timestamp>
   <trades>
      <trade segment_id="NSE-F&amp;O " instrument_id="NSE:INFRATEL17NOVFUT">
      <id>37513030</id>
      <order_id>1300000000352370</order_id>
      <timestamp>09:20:48</timestamp>
      <description>None</description>
      <type>buy</type>
      <quantity>1700</quantity>
      <average_price>444.2</average_price>
      <value>755140.0</value>
      </trade>
   </trades>
  </contract>
 </contracts>
</contract_note>

代码:

try {
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(xmlFile);

        NodeList cNoteList = doc.getElementsByTagName("contract");
        Node nNode = cNoteList.item(0);
        if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                Element eElement = (Element) nNode;
        for (int j = 1; j <= eElement.getElementsByTagName("trade").getLength(); j++) {
// Check if data can be read for Node - 'id'    
System.out.println(eElement.getElementsByTagName("id").item(j).getTextContent();
// Check if data can be read for segment_id & instrument_id         
System.out.println("Scrip: " + eElement.getElementsByTagName("trade").item(0).getTextContent());
                }
                }catch (Exception e) {
                    e.printStackTrace();
                }

编辑: 更正了上面提供的 xml 文件信息。

【问题讨论】:

  • & 字符是造成问题的原因。它应该被转义。
  • 在与 OP 反复讨论之后,真正的问题变成了一个基本的“我如何在 Java 中读取 XML 属性值”的问题。因重复而关闭。
  • 感谢您并诚挚道歉,您没有搜索您引用的主题。

标签: java xml parsing xml-parsing


【解决方案1】:

作为@Juan commented,您的XML 很糟糕。通过遵循required XML escaping rules 并将segment_id="NSE-F&amp;O " 替换为segment_id="NSE-F&amp;amp;O " 来修复它。

如果您无法更改 XML,请参阅 How to parse invalid (bad / not well-formed) XML? 了解选项,但最好的选择是从源头修复 XML。

【讨论】:

  • 谢谢,我现在在记事本中打开了 xml,并注意到它是 segment_id="NSE-F&O" 所以我认为文件应该没问题。
  • 对您的评论感到困惑:通知?你没有修好吗? 假设?你没有重新测试吗?
  • 很抱歉造成混淆。我在 IE 中打开了 XML,它显示为 segment_id="NSE-F&O"。但是,如果我在记事本中打开相同的 XML,它会显示为 segment_id="NSE-F&O"。我没有对 XML 文件进行任何更改。但是当我尝试解析时,无法读取该数据。我在做什么其他错误?
  • 请在您的问题中添加错误消息和堆栈跟踪,以及正确的minimal reproducible example
  • 没有发出错误。但输出只是读作“交易”。我的期望是它应该读作 'trade segment_id="NSE-F&O" instrument_id="NSE:INFRATEL17NOVFUT"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2013-06-07
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多