我有一个MySQL数据库,我在其中创建了一个带有 longtext 列的表,其中我将xml文件存储为字符串,所以我问是否可以使用他们的名称来获取节点一个特定的属性值! 这是我处理的xml的一个例子:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<HWData>
<Header time="2013-05-29T13:39:34" uploaded="true" version="1.0" />
<NE vendorName="Nokia Siemens Networks" NEId="WBTS-431">
<EQHO vendorName="Nokia Siemens Networks" equipmentHolderId="173" >
<UNIT vendorName="N" unitId="16" />
<UNIT vendorName="NOKIA SIEMENS NETWORKS" unitId="225" />
</EQHO>
<EQHO vendorName="NSN" equipmentHolderId="40192" >
<UNIT vendorName="AR" unitId="40267" />
</EQHO>
</NE>
<NE vendorName="Nokia Siemens Networks" NEId="WBTS-261">
<EQHO vendorName="Nokia Siemens Networks" equipmentHolderId="132" >
<EQHO vendorName="Nokia Siemens Networks" equipmentHolderId="132-1">
<UNIT vendorName="NN" unitId="1621" />
</EQHO>
</EQHO>
</NE>
</HWData>
可以使用“EQHO”(节点名称)和“NE-RNC-4 / DN:NE-WBTS-4204 / EQHO-173”(属性MOID的值)来使用SQL查询得到这个结果! :
<NE vendorName="Nokia Siemens Networks" NEId="WBTS-261">
<EQHO vendorName="Nokia Siemens Networks" equipmentHolderId="132" >
<EQHO vendorName="Nokia Siemens Networks" equipmentHolderId="132-1">
<UNIT vendorName="NN" unitId="1621" />
</EQHO>
</EQHO>
</NE>
有人可以让我以正确的方式实现这一目标。任何其他建议或示例将不胜感激。 提前谢谢
答案 0 :(得分:1)
在查询XML数据时,MySQL的功能非常有限。有ExtractValue()
函数可用于从XML文档中获取节点/属性值,但它不能返回子树。
您最好的选择可能是使用您选择的主机语言中的xpath。根据相关示例,按节点名称和特定属性值获取特定节点的Xpath如下:
//EQHO[@MOID="NE-RNC-4/DN:NE-WBTS-4204/EQHO-173"]
在xpath之上返回XML文档中<EQHO>
属性值等于MOID
的任何位置的所有"NE-RNC-4/DN:NE-WBTS-4204/EQHO-173"
元素。如果需要,您甚至可以通过将@MOID
替换为@*
而不知道属性名称来实现相同目标。
答案 1 :(得分:1)
我使用此方法将节点作为字符串获取并且工作正常:
public static String NodeToString(String file,String moid) throws SAXException, IOException, ParserConfigurationException{
String stringNode="";
InputStream in = new ByteArrayInputStream(file.getBytes("ISO-8859-1"));
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
NodeList nodeList = doc.getElementsByTagName("*");
for (int i = 0; i < nodeList.getLength(); i++) {
if(nodeList.item(i) instanceof Element && ((Element)nodeList.item(i)).getAttribute("MOID").equalsIgnoreCase(moid)){
try
{
// Set up the output transformer
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
trans.setOutputProperty(OutputKeys.INDENT, "yes");
// Print the DOM node
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(nodeList.item(i));
trans.transform(source, result);
stringNode = sw.toString();
//System.out.println(xmlString);
}
catch (TransformerException e)
{
e.printStackTrace();
}
}
}
return stringNode;
}
答案 2 :(得分:0)
您可以使用xpath。
/HWData/NE/EQHO[@MOID="NE-RNC-4/DN:NE-WBTS-4204/EQHO-173"]
示例java代码
InputSource is = new InputSource(new StringReader(xml)) ;
Document doc = builder.parse(is);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("/HWData/NE/EQHO[@MOID=\"NE-RNC-4/DN:NE-WBTS-4204/EQHO-173\"]");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < nl.getLength(); i++)
{
Node node = nl.item(i);
System.out.println(nl.item(i).getNodeName());
}