使用Java来解析XML

Mik*_*koP 3 php java xml

我制作了一个解析XML文件的PHP脚本.这不容易使用,我想用Java实现它.

在第一个元素内部,wfs:member我循环遍历各种元素:

foreach ($data->children("wfs", true)->member as $member) { }
Run Code Online (Sandbox Code Playgroud)

这很容易用Java做:

NodeList wfsMember = doc.getElementsByTagName("wfs:member");
for(int i = 0; i < wfsMember.getLength(); i++) { }
Run Code Online (Sandbox Code Playgroud)

我已经打开了这样的XML文件

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(WeatherDatabaseUpdater.class.getResourceAsStream("wfs.xml"));
Run Code Online (Sandbox Code Playgroud)

然后我需要从一个名为的元素中获取一个属性observerdProperty.在PHP中这很简单:

$member->
    children("omso", true)->PointTimeSeriesObservation->
    children("om", true)->observedProperty->
    attributes("xlink", true)->href
Run Code Online (Sandbox Code Playgroud)

但在Java中,我该怎么做?getElementsByTagName如果我想深入了解结构,我是否需要使用并循环它们?

在PHP中,整个脚本看起来如下.

foreach ($data->children("wfs", true)->member as $member) {
    $dataType = $dataTypes[(string) $member->
                    children("omso", true)->PointTimeSeriesObservation->
                    children("om", true)->observedProperty->
                    attributes("xlink", true)->href];

    foreach ($member->
            children("omso", true)->PointTimeSeriesObservation->
            children("om", true)->result->
            children("wml2", true)->MeasurementTimeseries->
            children("wml2", true)->point as $point) {

        $time = $point->children("wml2", true)->MeasurementTVP->children("wml2", true)->time;
        $value = $point->children("wml2", true)->MeasurementTVP->children("wml2", true)->value;

        $data[$dataType][] = array($time, $value)
    }
}
Run Code Online (Sandbox Code Playgroud)

在第二个foreachI循环通过观察元素并从中获取时间和值数据.然后我将它保存在一个数组中.如果我需要按照我描述的方式遍历Java中的元素,这很难实现.我不认为是这种情况,所以有人可以建议我如何在Java中实现类似的东西吗?

Adr*_*ang 6

如果性能不是主要问题,最简单的方法可能是XPath.使用XPath,您只需指定路径即可找到节点和属性.

XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile(<xpath_expression>);
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
Run Code Online (Sandbox Code Playgroud)

xpath_expression可以很简​​单

"string(//member/observedProperty/@href)"
Run Code Online (Sandbox Code Playgroud)

有关XPath的更多信息,W3Schools的XPath教程非常好.