【问题标题】:How to get an XML string by attribute value如何通过属性值获取 XML 字符串
【发布时间】:2020-10-01 01:24:51
【问题描述】:

我正在尝试解析 XML 文件以通过步骤 id 获取“流程图”步骤,该步骤 id 是步骤的子元素:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CATALOG>
  <FLOWCHART>
    <PRIMARYCODE>FC1</PRIMARYCODE>
    <NAME>Flowchart 1</NAME>
    <STEPS>
      <STEP id="1">was powered on.</STEP>
      <STEP id="2">was not connected with a connection plate.</STEP>
    </STEPS>
  </FLOWCHART>
  <FLOWCHART>
    <PRIMARYCODE>FC2</PRIMARYCODE>
    <NAME>Flowchart2</NAME>
    <STEPS>
      <STEP id="1">was not powered on.</STEP>
      <STEP id="2">was connected with a connection plate.</STEP>
    </STEPS>
  </FLOWCHART>
</CATALOG>

到目前为止,我拥有的 Java 代码将打印所有步骤和流程图代码,以及流程图描述,但我如何通过整数值请求特定步骤?

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
public class Flowchart
{
    public static void main(String argv[])
    {
        try
        {
//creating a constructor of file class and parsing an XML file
            File file = new File("src/flowchart.xml");
//an instance of factory that gives a document builder
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//an instance of builder to parse the specified xml file
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(file);
            doc.getDocumentElement().normalize();
            System.out.println("Root element: " + doc.getDocumentElement().getNodeName());
            NodeList nodeList = doc.getElementsByTagName("FLOWCHART");
// nodeList is not iterable, so we are using for loop
            for (int itr = 0; itr < nodeList.getLength(); itr++)
            {
                Node node = nodeList.item(itr);
                System.out.println("\nNode Name: " + node.getNodeName());
                if (node.getNodeType() == Node.ELEMENT_NODE)
                {
                    Element eElement = (Element) node;
                    System.out.println("Flowchart ID: "+ eElement.getElementsByTagName("PRIMARYCODE").item(0).getTextContent());
                    for (int i = 0; i < (eElement.getElementsByTagName("STEPS").getLength() + 1) ; i++)
                    {
                        System.out.println("Steps: "+ eElement.getElementsByTagName("STEP").item(i).getTextContent());
                    }

                }

            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

【问题讨论】:

    标签: java xml parsing


    【解决方案1】:

    为此,使用 XPath API 会更方便:

    import javax.xml.xpath.XPathExpression;
    import javax.xml.xpath.XPathExpressionException;
    import javax.xml.xpath.XPathFactory;
    
    public static String getStep(Document doc, String flowchartName, int stepId) throws XPathExpressionException {
            XPathFactory xpf = XPathFactory.newInstance();
            XPathExpression xpath = xpf.newXPath().compile("/CATALOG/FLOWCHART[NAME='" 
                    + flowchartName 
                    + "']/STEPS/STEP[@id='" 
                    + stepId 
                    + "']");
            return xpath.evaluate(doc);
        }
    

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2010-10-22
      相关资源
      最近更新 更多