首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >读取XML文件中的特定节点-使用JAVA

读取XML文件中的特定节点-使用JAVA
EN

Stack Overflow用户
提问于 2018-08-23 06:25:54
回答 3查看 449关注 0票数 1

我有以下XML,我想读取节点"output“中的内容。这个"output“节点在节点"test”内。我可以一直到"test“节点。但在那之后,我就拿不到了。有什么想法吗?我正在使用java来读取文件。

    <?xml version="1.0" encoding="UTF-8"?>
<testrun duration="144040" footerText="Generated by IntelliJ IDEA on 22/08/18 2:45 PM" name="UnitTests">
        <count name="total" value="4"/>
        <count name="error" value="1"/>
        <count name="passed" value="3"/>
        <config nameIsGenerated="true" configId="JUnit" name="UnitTests">
            <module name="Unit-Test"/>
            <option name="PACKAGE_NAME" value=""/>
            <option name="MAIN_CLASS_NAME" value="UnitTests"/>
        </config>
        <root name="UnitTests" location="java:suite://UnitTests">
            <output type="stdout">/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home/bin/java -ea -Didea.test.cyclic.buffer.size=1048576 &amp;quot;-javaagent:/Applications/IntelliJ IDEA n-2.8.5.jar&amp;quot; com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 UnitTests
    Process finished with exit code 255
    </output>
        </root>
        <test duration="41937" locationUrl="java:test://UnitTests/signingupUser" name="UnitTests.signingupUser" status="passed">
            <output type="stderr">Aug 22, 2018 2:42:58 PM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
    INFO: Detected dialect: W3C
    </output>
        </test>
        <test duration="44245" locationUrl="java:test://UnitTests/onBoardingTesting" name="UnitTests.onBoardingTesting" status="error">
            <output type="stderr">Aug 22, 2018 2:43:38 PM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
    INFO: Detected dialect: W3C
    org.openqa.selenium.TimeoutException: Expected condition failed: waiting for presence of element located by: By.xpath: /hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.LinearLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.RelativeLayout/android.widget.TextView[1] (tried for 15 second(s) with 500 milliseconds interval)
        at org.openqa.selenium.support.ui.WebDriverWait.timeoutException(WebDriverWait.java:113)
    For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
    </output>
        </test>
        <test duration="32198" locationUrl="java:test://UnitTests/loginSucessfully" name="UnitTests.loginSucessfully" status="passed">
            <output type="stderr">Aug 22, 2018 2:44:24 PM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
    INFO: Detected dialect: W3C
    </output>
        </test>
        <test duration="25660" locationUrl="java:test://UnitTests/loginInvalidEmail" name="UnitTests.loginInvalidEmail" status="passed">
            <output type="stderr">Aug 22, 2018 2:44:51 PM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
    INFO: Detected dialect: W3C
    </output>
        </test>
    </testrun>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-23 07:04:00

您可以反序列化xml并将其映射到pojo类。将xml转换为pojo获得一些帮助:http://pojo.sodhanalibrary.com/

Jackson pom依赖:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.4</version>
</dependency>

以下是获取测试值的代码和相应的输出:

输出:

ClassPojo [content = Aug 22, 2018 2:42:58 PM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
            INFO: Detected dialect: W3C
        , type = stderr]
ClassPojo [content = Aug 22, 2018 2:43:38 PM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
            INFO: Detected dialect: W3C
            org.openqa.selenium.TimeoutException: Expected condition failed: waiting for presence of element located by: By.xpath: /hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.LinearLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.RelativeLayout/android.widget.TextView[1] (tried for 15 second(s) with 500 milliseconds interval)
            at org.openqa.selenium.support.ui.WebDriverWait.timeoutException(WebDriverWait.java:113)
            For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
        , type = stderr]
ClassPojo [content = Aug 22, 2018 2:44:24 PM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
            INFO: Detected dialect: W3C
        , type = stderr]
ClassPojo [content = Aug 22, 2018 2:44:51 PM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
            INFO: Detected dialect: W3C
        , type = stderr]

代码:

package yourpackage;

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Main {

    public static void main(String[]args) throws IOException {

        XmlMapper xmlMapper = new XmlMapper();
        String xml = new String(Files.readAllBytes(Paths.get("test.xml")));
        Testrun value = xmlMapper.readValue(xml, Testrun.class);

        for(Test t : value.getTest()) System.out.println(t.getOutput());
    }
}

class Test
{
    private String duration;
    private String locationUrl;
    private String status;
    private String name;
    private Output output;

    public String getDuration ()
    {
        return duration;
    }

    public void setDuration (String duration)
    {
        this.duration = duration;
    }

    public String getLocationUrl ()
    {
        return locationUrl;
    }

    public void setLocationUrl (String locationUrl)
    {
        this.locationUrl = locationUrl;
    }

    public String getStatus ()
    {
        return status;
    }

    public void setStatus (String status)
    {
        this.status = status;
    }

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public Output getOutput ()
    {
        return output;
    }

    public void setOutput (Output output)
    {
        this.output = output;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [duration = "+duration+", locationUrl = "+locationUrl+", status = "+status+", name = "+name+", output = "+output+"]";
    }
}


class Output
{
    @JacksonXmlText
    private String content;
    @JacksonXmlProperty(localName = "type")
    private String type;

    public String getContent ()
    {
        return content;
    }

    public void setContent (String content)
    {
        this.content = content;
    }

    public String getType ()
    {
        return type;
    }

    public void setType (String type)
    {
        this.type = type;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [content = "+content+", type = "+type+"]";
    }
}


class Count
{
    private String name;

    private String value;

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public String getValue ()
    {
        return value;
    }

    public void setValue (String value)
    {
        this.value = value;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [name = "+name+", value = "+value+"]";
    }
}

class Root
{
    private String location;

    private String name;

    private Output output;

    public String getLocation ()
    {
        return location;
    }

    public void setLocation (String location)
    {
        this.location = location;
    }

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public Output getOutput ()
    {
        return output;
    }

    public void setOutput (Output output)
    {
        this.output = output;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [location = "+location+", name = "+name+", output = "+output+"]";
    }
}


class Module
{
    private String name;

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [name = "+name+"]";
    }
}

class Option
{
    private String name;

    private String value;

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public String getValue ()
    {
        return value;
    }

    public void setValue (String value)
    {
        this.value = value;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [name = "+name+", value = "+value+"]";
    }
}

class Config
{
    private Module module;

    private String name;

    private String nameIsGenerated;

    private Option[] option;

    private String configId;

    public Module getModule ()
    {
        return module;
    }

    public void setModule (Module module)
    {
        this.module = module;
    }

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public String getNameIsGenerated ()
    {
        return nameIsGenerated;
    }

    public void setNameIsGenerated (String nameIsGenerated)
    {
        this.nameIsGenerated = nameIsGenerated;
    }

    public Option[] getOption ()
    {
        return option;
    }

    public void setOption (Option[] option)
    {
        this.option = option;
    }

    public String getConfigId ()
    {
        return configId;
    }

    public void setConfigId (String configId)
    {
        this.configId = configId;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [module = "+module+", name = "+name+", nameIsGenerated = "+nameIsGenerated+", option = "+option+", configId = "+configId+"]";
    }
}

class Testrun
{
    private String duration;

    private String footerText;

    private Count[] count;

    private Root root;

    @JacksonXmlElementWrapper(useWrapping=false, localName = "test")
    private Test[] test;

    private String name;

    private Config config;

    public String getDuration ()
    {
        return duration;
    }

    public void setDuration (String duration)
    {
        this.duration = duration;
    }

    public String getFooterText ()
    {
        return footerText;
    }

    public void setFooterText (String footerText)
    {
        this.footerText = footerText;
    }

    public Count[] getCount ()
    {
        return count;
    }

    public void setCount (Count[] count)
    {
        this.count = count;
    }

    public Root getRoot ()
    {
        return root;
    }

    public void setRoot (Root root)
    {
        this.root = root;
    }

    public Test[] getTest ()
    {
        return test;
    }

    public void setTest (Test[] test)
    {
        this.test = test;
    }

    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    public Config getConfig ()
    {
        return config;
    }

    public void setConfig (Config config)
    {
        this.config = config;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [duration = "+duration+", footerText = "+footerText+", count = "+count+", root = "+root+", test = "+test+", name = "+name+", config = "+config+"]";
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-08-23 07:23:30

使用XPath

try (InputStream xml = new BufferedInputStream(
    Files.newInputStream(pathOfXmlFile))) {

    XPath xpath = XPathFactory.newInstance().newXPath();
    NodeList outputNodes = (NodeList) xpath.evaluate("//test/output",
        new InputSource(xml), XPathConstants.NODESET);

    int count = outputNodes.getLength();
    for (int i = 0; i < count; i++) {
        Node outputNode = outputNodes.item(i);
        System.out.println(
            "output node content: " + outputNode.getTextContent());
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-08-23 07:44:05

有一个流畅的XML阅读器可以创造奇迹。它被称为Joox ( https://github.com/jOOQ/jOOX),它允许你做如下事情:

// Find the order at index four and add an element "paid"
joox(document).find("orders")
              .children()
              .eq(4)
              .append("<paid>true</paid>");

如果您不需要创建大量pojos,则可以省去创建它们的麻烦。因此您可以使用它和Xpath来实现您的目标。

joox(document).xpath( "//test/output").foreach(/*Do what you need to do*/);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51975985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档