【问题标题】:Java parse XML to get Child Element valueJava 解析 XML 以获取子元素值
【发布时间】:2023-04-08 21:20:02
【问题描述】:

我有一个包含以下 XML 代码的 java 字符串:

<?xml version="1.0" encoding="utf-8"?>
    <Chart>
        <request>
            <zip>12345</zip>
            <city>Miami</city>
        </request>
    </Chart>

解析这个字符串以提取值的最简单方法是什么

<zip> (in this case 12345)

【问题讨论】:

标签: java xml parsing dom


【解决方案1】:

您有 XML,最好将其解析为 XML,并直接使用 XPATH

import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;


String xml="<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" + 
        "    <Chart>\r\n" + 
        "        <request>\r\n" + 
        "            <zip>12345</zip>\r\n" + 
        "            <city>Miami</city>\r\n" + 
        "        </request>\r\n" + 
        "    </Chart>";

DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder builder = builderFactory.newDocumentBuilder();

// PARSE XML
Document document = builder.parse(new InputSource(new  StringReader(xml)));

// XPATH
XPath xPath = XPathFactory.newInstance().newXPath();
// your path
String expression = "//Chart/request/zip";

NodeList nodes  = (NodeList)  xPath.compile(expression).evaluate(document, XPathConstants.NODESET);

for(int i=0; i<nodes.getLength(); i++)
     {
      Node the_node = nodes.item(i);

     if(the_node instanceof Element)
          {
          Element the_element=(Element) the_node;
          System.out.println("element="+the_element.getTextContent());
          break; // STOP at the first
          }
      }

【讨论】:

  • 感谢您的回复。 XPATH 是否需要库?如何解决“找不到符号”
【解决方案2】:

无需深入使用 Java 解析 xml 的黑暗世界,您可以使用正则表达式:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class FindZip {

  public static void main(String[] args) {
    Pattern pattern = 
    Pattern.compile("<zip>(\\d+)</zip>");
    String zip_code;

    Matcher matcher = pattern.matcher(
        "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
        "<Chart>" +
        "    <request>" +
        "        <zip>12345</zip>" +
        "        <city>Miami</city>" +
        "    </request>" +
        "</Chart>"
      );

    boolean found = false;
    while (matcher.find()) {
      zip_code = matcher.group(1);
      System.out.printf(
          "I found the zip code \"%s\" starting at index %d and ending at index %d.%n",
          zip_code,
          matcher.start(1),
          matcher.end(1)
        );
      found = true;
    }
    if (!found) {
      System.out.println("No match found.");
    }
  }
}

这种方法有明显的缺点和限制,但至少你知道你的邮政编码

【讨论】:

  • 使用正则表达式,如何修改您提供的代码以将 zip 的值放入字符串?
  • 你会使用String zip_code = matcher.group(1);。我已经修改了答案。
  • 如果您要从 XML 中提取许多不同的字段,您可能想要使用其他答案。但是,要回答您的问题,捕获货币的正则表达式可能会因格式而异。货币价值总是整数吗?它会包含美分吗?它会包含货币符号吗?可能有负值吗?您最好捕获价值和货币类型,然后使用格式化程序,如this SO answer 中所述。
  • 感谢您的帮助。如果标签包含一个url,我应该把“\\d+”改成什么?
  • 这是一个匹配 URL 的正则表达式示例:(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?。它并不完美或不完整,但正如您所见,它很复杂。或者,您可以使用非常通用的东西,例如.*。然后像这样解析值:String url = new URL(matcher..find());。尽管如此,此时正确解析 XML 并使用 XPath 获取所需字段会更容易/更好。
猜你喜欢
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2012-09-10
  • 2012-04-03
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多