2010-12-24 5 views
7

Данный XML-документ, который выглядит следующим образом:Получить значение узла XML и атрибутов узла с помощью XPath в JAXP

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> 
    <entry key="agentType">STANDARD</entry> 
    <entry key="DestinationTransferStates"></entry> 
    <entry key="AgentStatusPublishRate">300</entry> 
    <entry key="agentVersion">f000-703-GM2-20101109-1550</entry> 
    <entry key="CommandTimeUTC">2010-12-24T02:25:43Z</entry> 
    <entry key="PublishTimeUTC">2010-12-24T02:26:09Z</entry> 
    <entry key="queueManager">AGENTQMGR</entry> 
</properties> 

Я хочу напечатать значения «ключа» атрибута и элемента, так это выглядит как это:

agentType = STANDARD 
DestinationTransferStates = 
AgentStatusPublishRate = 300 
agentVersion = f000-703-GM2-20101109-1550 
CommandTimeUTC = 2010-12-24T02:25:43Z 
PublishTimeUTC = 2010-12-24T02:26:09Z 
queueManager = AGENTQMGR 

Я могу напечатать значения узлов без проблем, используя этот код:

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
XPathExpression expr = xpath.compile("//properties/entry/text()"); 

Object result = expr.evaluate(doc, XPathConstants.NODESET); 
NodeList nodes = (NodeList) result; 
for (int i = 0; i < nodes.getLength(); i++) { 
    System.out.println(nodes.item(i).getNodeValue()); 
} 

И я могу напечатать значения атрибута «ключ», изменив выражение XPath и методы узлов следующим образом:

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
XPathExpression expr = xpath.compile("//properties/entry"); 
Object result = expr.evaluate(doc, XPathConstants.NODESET); 
NodeList nodes = (NodeList) result; 
for (int i = 0; i < nodes.getLength(); i++) { 
    System.out.println(nodes.item(i).getAttributes().getNamedItem("key").getNodeValue()); 
} 

Похоже было бы способ получить в обоих из этих значений в одном evaluate. Я всегда мог оценить два NodeLists и перебирать их с помощью общего индекса, но я не уверен, что они будут возвращены в том же порядке. Любые предложения оценили.

+0

похоже, что xml-код jaxp довольно грязный, вы открыты для другого типа xml apis? –

+0

Как только я получил код JAXP, я написал его в XSLT. Это было намного чище (выглядит как HTML с некоторой добавленной разметкой), но навсегда визуализируется. Теперь я собираюсь попробовать XSLT с траншетом. Другие предложения определенно приветствуются. –

ответ

11

Что относительно getTextContent()? Это должно делать работу.

Object result = expr.evaluate(doc, XPathConstants.NODESET); 
NodeList nodes = (NodeList) result; 
for (int i = 0; i < nodes.getLength(); i++) 
{ 
    Node currentItem = nodes.item(i); 
    String key = currentItem.getAttributes().getNamedItem("key").getNodeValue(); 
    String value = currentItem.getTextContent(); 

    System.out.printf("%1s = %2s\n", key, value); 
} 

Для получения более подробной информации обратитесь к Javadoc для getTextContent(). Я надеюсь, что это поможет вам.

+0

Скопировано, вставлено, отлично работает. Благодаря! Пойду посмотрю на getTextContent(). –

Смежные вопросы