как получить значение атрибута XML-узла с помощью java
у меня есть XML, который выглядит так:
{ <xml><ep><source type="xml">...</source><source type="text">..</source></ep></xml>}
здесь я хочу получить значение "тип источника", где тип с атрибутом.
Я пробовал, как это,но его не работает:
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document dDoc = builder.parse("D:/workspace1/ereader/src/main/webapp/configurations/config.xml");
System.out.println(dDoc);
XPath xPath = XPathFactory.newInstance().newXPath();
Node node = (Node) xPath.evaluate("//xml/source/@type/text()", dDoc, XPathConstants.NODE);
System.out.println(node);
} catch (Exception e) {
e.printStackTrace();
Я тоже пробовал:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource is = new InputSource(new StringReader("config.xml"));
Document doc = builder.parse(is);
NodeList nodeList = doc.getElementsByTagName("source");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.hasAttributes()) {
Attr attr = (Attr) node.getAttributes().getNamedItem("type");
if (attr != null) {
String attribute= attr.getValue();
System.out.println("attribute: " + attribute);
}
}
}
pls помогите мне!!
спасибо заранее, Варша.
6 ответов
поскольку ваш вопрос более общий, попробуйте реализовать его с помощью синтаксических анализаторов XML, доступных в Java .Если вам это нужно в конкретных парсерах, обновите свой код здесь, что вы уже пробовали
<?xml version="1.0" encoding="UTF-8"?>
<ep>
<source type="xml">TEST</source>
<source type="text"></source>
</ep>
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("uri to xmlfile");
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("//ep/source[@type]");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < nl.getLength(); i++)
{
Node currentItem = nl.item(i);
String key = currentItem.getAttributes().getNamedItem("type").getNodeValue();
System.out.println(key);
}
попробуйте что-то вроде этого :
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document dDoc = builder.parse("d://utf8test.xml");
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList) xPath.evaluate("//xml/ep/source/@type", dDoc, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
System.out.println(node.getTextContent());
}
пожалуйста, обратите внимание на изменения :
- мы просим nodeset (XPathConstants.NODESET) и не только для одного узла.
- XPath-это сейчас //формате XML/ЕР/источник/@типа и не //формате XML/источник/@тип/текст()
PS: можете ли вы добавить тег java в свой вопрос ? спасибо.
использовать
документ.getElementsByTagName ("*");
чтобы получить все XML-элементы из XML-файла, это, однако, возвращает повторяющиеся атрибуты
пример:
список узлов = doc.getElementsByTagName ("*");
Ниже приведен код, чтобы сделать его в VTD-XML
import com.ximpleware.*;
public class queryAttr{
public static void main(String[] s) throws VTDException{
VTDGen vg= new VTDGen();
if (!vg.parseFile("input.xml", false))
return false;
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("//xml/ep/source/@type");
int i=0;
while((i = ap.evalXPath())!=-1){
system.out.println(" attr val ===>"+ vn.toString(i+1));
}
}
}
Я рад, что этот фрагмент прекрасно работает:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new File("config.xml"));
NodeList nodeList = document.getElementsByTagName("source");
for(int x=0,size= nodeList.getLength(); x<size; x++) {
System.out.println(nodeList.item(x).getAttributes().getNamedItem("type").getNodeValue());
}
public static void main(String[] args) throws IOException {
String filePath = "/Users/myXml/VH181.xml";
File xmlFile = new File(filePath);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
try {
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();
printElement(doc);
System.out.println("XML file updated successfully");
} catch (SAXException | ParserConfigurationException e1) {
e1.printStackTrace();
}
}
private static void printElement(Document someNode) {
NodeList nodeList = someNode.getElementsByTagName("choiceInteraction");
for(int z=0,size= nodeList.getLength();z<size; z++) {
String Value = nodeList.item(z).getAttributes().getNamedItem("id").getNodeValue();
System.out.println("Choice Interaction Id:"+Value);
}
}
мы можем попробовать этот код с помощью метода