【问题标题】:Read single XML line with Java使用 Java 读取单个 XML 行
【发布时间】:2011-03-08 10:35:45
【问题描述】:

我正在尝试读取如下所示的单个 XML 行:

<position lat="59.3252414125" long="18.0750236375" accuracy="1000"></position>

这里的目标是将“lat”、“long”和“accuracy”的值放入三个Java变量中。

编辑:我想我应该提到该行是从 XML 中读取的,所以它不像看起来那样容易编辑。

【问题讨论】:

  • 你用的是什么xml框架?
  • 那么,有什么问题?
  • 默认 jdk 基本上有 2 个选择:sax/stax 和 dom
  • 我闻到了家庭作业或带回家的面试问题。
  • 我已经尝试过使用更大规模的 SAX 解析器来读取高分列表,但在此过程中我只是在某个地方感到困惑。我试着四处寻找一种简单的阅读方式,但我发现大多数都遵循多元素结构。我想我只是不太擅长阅读 XML。

标签: java xml


【解决方案1】:

试试:

    String s = "<position lat=\"59.3252414125\" long=\"18.0750236375\" accuracy=\"1000\"></position>";
    InputSource is = new InputSource(new StringReader(s));
    DOMParser dp = new DOMParser();
    dp.parse(is);
    Document doc = dp.getDocument();
    NodeList nl = doc.getElementsByTagName("position");
    Node n = nl.item(0);
    NamedNodeMap nnm = n.getAttributes();
    String lat = nnm.getNamedItem("lat").getFirstChild().getTextContent();
    String longg = nnm.getNamedItem("long").getFirstChild().getTextContent();
    String accuracy = nnm.getNamedItem("accuracy").getFirstChild().getTextContent();

推荐阅读:

【讨论】:

  • 如果有问题的 XML 行是从 XML 文件中读取的,那么处理的方式会有很大不同吗?因为我已经隔离了最后 3 行以导致 NullPointerException。
  • @Zephyr 如果您正在从文件中读取,请使用:dp.parse("complete\\file\\path\\fully\\escaped");
  • 现在可以使用了!我交换了 .getFirstChild().getTextContent();用 getNodeValue());
【解决方案2】:

仅使用 String.split() 函数:

package com.stackoverflow.q5231285;

public class Test {
    public static void main(String[] args) {
        String xmlLine = "<position lat=\"59.3252414125\" long=\"18.0750236375\" accuracy=\"1000\"></position>";
        String splitResult[] = xmlLine.split("\"");

        Double latValue = Double.parseDouble(splitResult[1]);
        Double longValue = Double.parseDouble(splitResult[3]);
        int accuracy = Integer.parseInt(splitResult[5]);
        System.out.println(latValue + " " + longValue + " " + accuracy);
    }
}

【讨论】:

  • 不是解析有组织的 XML 数据的正确方法。当数据如此干净时,这是残酷的。可以解决眼前的问题,但是不好的做法。不过,不会投反对票。
  • 当然不是解析 XML 的好习惯,但问题要求解析具有给定格式的字符串。当然,如果属性顺序发生更改,我的代码将无法正常工作,但是当不需要灵活性时,为了简单而失去灵活性,我认为没有任何问题。有时我们(程序员)在没有必要的时候添加非明确的要求。
【解决方案3】:

如果您使用的是 SAX 或 StAX,您最终可能会得到 XMLEventReaderXMLStreamReader。两者都有方法来确定当前正在处理的 XML ElementEvent 的类型,在 XMLStreamConstants 中定义。
如果您有 position 元素,如果您正在使用 EventReader,则只需使用 nextEvent() 获取下一个事件,或者如果您正在使用 StreamReader,则使用 getAttributeValue() 获取属性值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2015-10-06
    • 2011-08-21
    • 2019-03-09
    • 1970-01-01
    • 2019-08-09
    • 2014-10-28
    相关资源
    最近更新 更多