在java中读取并获取xml值

时间:2016-04-20 05:55:58

标签: java xml

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

<?xml version="1.0" encoding="UTF-8"?>
<event id="370e7324-3-85ec-63dac16aacb6">
<properties>
<property enc="BASE64" name="state" value="Hrthyw35WmnmewqzRlYXI="/>
<property enc="BASE64" name="record" value="mjhm65WmnmewqzRlYXI="/>    
<property enc="BASE64" name="application" value="Q2FsZWmnmewqzRlYXI="/>
</properties>
</event>

我的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();
}

我得到三个名字和三个值,但我只想要第三个名字和值。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

实施例

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<event id=\"370e7324-3-85ec-63dac16aacb6\">\n"
        + "<properties>\n" + "<property enc=\"BASE64\" name=\"state\" value=\"Hrthyw35WmnmewqzRlYXI=\"/>\n"
        + "<property enc=\"BASE64\" name=\"record\" value=\"mjhm65WmnmewqzRlYXI=\"/>\n"
        + "<property enc=\"BASE64\" name=\"application\" value=\"Q2FsZWmnmewqzRlYXI=\"/>\n" + "</properties>\n"
        + "</event>\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来表达这一点,{{3}}是一种具有本机Java支持的XML选择语言。

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

答案 2 :(得分:0)

为什么不使用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
  4. 因为你还没有使用过JAXB,让我们用最简单的方法来做,而不使用命令行,maven等。

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

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified" attributeFormDefault="unqualified">
        <xs:element name="event">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="properties">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="property" maxOccurs="unbounded">
                                    <xs:complexType>
                                        <xs:attribute name="enc" type="xs:string"></xs:attribute>
                                        <xs:attribute name="name" type="xs:string"></xs:attribute>
                                        <xs:attribute name="value" type="xs:string"></xs:attribute>
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
                <xs:attribute name="id" type="xs:string"></xs:attribute>
            </xs:complexType>
        </xs:element>
    </xs:schema>
    

    已编辑:您还可以将enc,name和value字段设为可选。如果他们不在场,也会很好。

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

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

    现在,在eclipse中右键单击Property.xsd - &gt;生成 - &gt; JAXB类

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

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

    File Structure of Project

    您的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<Property> 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();
                }
    
            }
        }