【问题标题】:read xml content from http endpoint like a map in Java从 http 端点读取 xml 内容,就像 Java 中的地图一样
【发布时间】:2020-08-18 21:03:38
【问题描述】:

如何根据来自 XML 内容 http 端点的键获取值,所以它类似于

<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>

我想在只有keyId=="0right0" 时获得valueId,我之前写过以下内容但无法获得特定键的值。

            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;
                    }
                }
            }

【问题讨论】:

    标签: java xml http parsing


    【解决方案1】:

    您需要将XML 元素与属性区分开来。要读取属性名称和值,您必须分别使用getAttributeNamegetAttributeValue 方法。

    下面是如何读取属性的示例代码:

    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]
    

    【讨论】:

    • nitpick: if (attributeName.getLocalPart().equals("sku")) { value = reader.getAttributeValue(attr); } 可以有一个break 对吗?尤其是当我们只需要它的一个值时
    • @user8142520,并非总是如此。假设我们找到了value,但还没有找到key。如果我们从循环中中断,方法将返回空的Optional 对象。您必须检查是否已检查 valuekey 属性。如果是,我们可以安全地跳出循环。在其他情况下,我们需要检查其他属性。
    【解决方案2】:

    您可以使用 xpath 来获得所需的值:

    string(//TestEntry[@keyId="0right0"]/@valueId)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2015-07-19
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多