从http端点读取xml内容,就像java中的Map一样

zf2sa74q  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(230)

如何从xml内容http enpoint获取基于键的值

<authority.result result="found 7 matches" startToken="xxxxxxx">
<TestEntry keyId="0right0" test="test" valueId="rightValue123" version="1"/>
<TestEntry keyId="0wrong" test="test" valueId="0wrongValue" version="1"/>
<TestEntry keyId="0wrong0" test="test" valueId="wrong" version="1"/>
</authority.result>

我想拿到 valueId 什么时候 keyId=="0right0" 只是,我以前写过以下内容,但无法获取特定键的值。

URL url = new URL(endpoint);
            XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(url.openStream());
            String latest;
            while (reader.hasNext()) {
                if (reader.next() == XMLStreamConstants.START_ELEMENT) {
                    if (reader.getLocalName().equals("valueId")) {
                        latest = reader.getElementText();
                        return latest;
                    }
                }
            }
xam8gpfp

xam8gpfp1#

可以使用xpath获得所需的值: string(//TestEntry[@keyId="0right0"]/@valueId)

vxqlmq5t

vxqlmq5t2#

你需要区分 XML 属性中的元素。要读取属性名称和值,必须使用 getAttributeName 以及 getAttributeValue 方法。
下面是如何读取属性的示例代码:

import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;

public class XmlStreamApp {
    public static void main(String[] args) throws IOException, XMLStreamException {
        ...
        XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(stream);
        Optional<String> value = findValueForTestEntry(reader, "0right0");
        System.out.println(value);
    }

    private static Optional<String> findValueForTestEntry(XMLStreamReader reader, String keyValue) throws XMLStreamException {
        while (reader.hasNext()) {
            if (reader.next() == XMLStreamConstants.START_ELEMENT) {
                String localName = reader.getLocalName();
                if ("TestEntry".equals(localName)) {
                    Optional<String> optionalValue = getValueForKey(reader, keyValue);
                    if (optionalValue.isPresent()) {
                        return optionalValue;
                    }
                }
            }
        }
        return Optional.empty();
    }

    private static Optional<String> getValueForKey(XMLStreamReader reader, String keyValue) {
        String value = "";
        boolean found = false;
        for (int attr = reader.getAttributeCount() - 1; attr >= 0; attr--) {
            QName attributeName = reader.getAttributeName(attr);
            if (attributeName.getLocalPart().equals("keyId")) {
                found = keyValue.equals(reader.getAttributeValue(attr));
            }
            if (attributeName.getLocalPart().equals("valueId")) {
                value = reader.getAttributeValue(attr);
            }
        }
        return found ? Optional.of(value) : Optional.empty();
    }
}

以上代码打印:

Optional[rightValue123]

相关问题