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

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

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

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

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

  1. URL url = new URL(endpoint);
  2. XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(url.openStream());
  3. String latest;
  4. while (reader.hasNext()) {
  5. if (reader.next() == XMLStreamConstants.START_ELEMENT) {
  6. if (reader.getLocalName().equals("valueId")) {
  7. latest = reader.getElementText();
  8. return latest;
  9. }
  10. }
  11. }
xam8gpfp

xam8gpfp1#

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

vxqlmq5t

vxqlmq5t2#

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

  1. import javax.xml.namespace.QName;
  2. import javax.xml.stream.XMLInputFactory;
  3. import javax.xml.stream.XMLStreamConstants;
  4. import javax.xml.stream.XMLStreamException;
  5. import javax.xml.stream.XMLStreamReader;
  6. import java.io.IOException;
  7. import java.nio.file.Files;
  8. import java.nio.file.Path;
  9. import java.nio.file.Paths;
  10. import java.util.Optional;
  11. public class XmlStreamApp {
  12. public static void main(String[] args) throws IOException, XMLStreamException {
  13. ...
  14. XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(stream);
  15. Optional<String> value = findValueForTestEntry(reader, "0right0");
  16. System.out.println(value);
  17. }
  18. private static Optional<String> findValueForTestEntry(XMLStreamReader reader, String keyValue) throws XMLStreamException {
  19. while (reader.hasNext()) {
  20. if (reader.next() == XMLStreamConstants.START_ELEMENT) {
  21. String localName = reader.getLocalName();
  22. if ("TestEntry".equals(localName)) {
  23. Optional<String> optionalValue = getValueForKey(reader, keyValue);
  24. if (optionalValue.isPresent()) {
  25. return optionalValue;
  26. }
  27. }
  28. }
  29. }
  30. return Optional.empty();
  31. }
  32. private static Optional<String> getValueForKey(XMLStreamReader reader, String keyValue) {
  33. String value = "";
  34. boolean found = false;
  35. for (int attr = reader.getAttributeCount() - 1; attr >= 0; attr--) {
  36. QName attributeName = reader.getAttributeName(attr);
  37. if (attributeName.getLocalPart().equals("keyId")) {
  38. found = keyValue.equals(reader.getAttributeValue(attr));
  39. }
  40. if (attributeName.getLocalPart().equals("valueId")) {
  41. value = reader.getAttributeValue(attr);
  42. }
  43. }
  44. return found ? Optional.of(value) : Optional.empty();
  45. }
  46. }

以上代码打印:

  1. Optional[rightValue123]
展开查看全部

相关问题