我的列数据采用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();
}
我得到三个名字和三个值,但我只想要第三个名字和值。
答案 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。你可以在下面找到一些教程。
因为你还没有使用过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的类。
您的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();
}
}
}