在java中读取并获取xml值

我有列数据是XML格式与Base64 encryption.i通过使用java得到的值,但所有值得到我只想要特定的值

        

我的java代码是

 try { Query q="select xml from empdata"; String xml = result.getString(1); System.out.println("----xml----"+xml); sqlService.dbRead(connection,sql.toString(),new SqlReader() { @Override public Object readRecord(ResultSet result) { try { String xml = result.getString(1); // read the xml InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(is); doc.getDocumentElement().normalize(); NodeList nList = doc.getElementsByTagName("property"); String name = null; String value = null; for (int temp = 0; temp < nList.getLength(); temp++) { Node node = nList.item(temp); Element element=null; if (node.getNodeType() == Node.ELEMENT_NODE) { element = (Element) node; name= element.getAttribute("name"); value = element.getAttribute("value"); System.out.println("--value--"+value+"----name----"+name); } } } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }); }catch (SQLException e) { e.printStackTrace(); } 

我有三个名字和三个值,但我只想要第三个名字和价值。

假设你想要一个名为“application”的那个..

您还可以简化代码,无需检查节点的类型,getElementsByTagName将只返回Element类型的节点。

 String xml = "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n"; DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(new InputSource(new StringReader(xml))); doc.getDocumentElement().normalize(); NodeList properties = doc.getElementsByTagName("property"); for (int index = 0; index < properties.getLength(); index++) { Node node = properties.item(index); Element element = (Element) node; if ("application".equals(element.getAttribute("name"))) { String name = element.getAttribute("name"); String valueEncoded = element.getAttribute("value"); String decoded = new String(Base64.getDecoder().decode(valueEncoded)); System.out.println("--value--" + decoded); } } 

作为编写自己的过滤逻辑的替代方法,您可以使用XPath表达这一点, XPath是一种具有本机Java支持的XML选择语言。

 XPath xPath = XPathFactory.newInstance().newXPath(); Element element = (Element) xPath.compile("//property[@name=\"application\"]").evaluate(doc, XPathConstants.NODE); String value = element.getAttribute("value"); 

如果你真的需要第三个属性(不是“应用程序”),你必须计算节点..

 var nodeIndex = -1; for (int temp = 0; temp < nList.getLength(); temp++) { ... if (node.getNodeType() == Node.ELEMENT_NODE) { nodeIndex++; ... if (nodeIndex == 2){ ... System.out.println("--value--"+value+"----name----"+name); } } } 

为什么不使用JAXB。 大多数企业应用程序都使用JAXB。 您可以在下面获得一些教程。

  1. http://www.mkyong.com/java/jaxb-hello-world-example/
  2. https://examples.javacodegeeks.com/core-java/xml/bind/jaxb-marshal-example/
  3. https://www.javacodegeeks.com/2014/12/jaxb-tutorial-xml-binding.html

因为,你还没有使用JAXB,让我们用最简单的方法做,而不使用命令行,maven等。

第1步:首先,您需要制作xsd文件。 有许多在线网站可以生成xsd。 立即使用http://xmlgrid.net/xml2xsd.html 。 XSD看起来应该是这样的。

                        

编辑:您还可以使enc,名称和值字段可选。 如果它们不在场,它也会好的。

步骤2.现在在eclipse中创建一个简单的java项目,并确保JDK存在于类路径或库中而不是JRE中。 否则你会得到以下exception。

 Error: Could not find or load main class com.sun.tools.internal.xjc.XJCFacade 

现在,在eclipse中右键单击Property.xsd – > Generate – > JAXB Classes

注意:如果将其更改为jdk不起作用。 确保在类路径中有JAXB所需的JAR。

步骤3.将创建一个名为generated的新源文件夹。现在创建一个读取xml的类。

项目的文件结构

您的PropertyLoad类应如下所示。

 package generated; import java.io.File; import java.util.Iterator; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import generated.Event.Properties.Property; public class LoadProperties { public static void main(String[] args) { try { File file = new File("src/property.xml"); JAXBContext jaxbContext = JAXBContext.newInstance(Event.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); Event event = (Event) jaxbUnmarshaller.unmarshal(file); Iterator itr = event.getProperties().getProperty().iterator(); while (itr.hasNext()) { Property prop = itr.next(); System.out.println( "Encoding : " + prop.getEnc() + "Name : " + prop.getName() + " Value : " + prop.getValue()); } } catch (JAXBException e) { e.printStackTrace(); } } }