从 Java 中的 XML 字符串中检索属性值
Posted
技术标签:
【中文标题】从 Java 中的 XML 字符串中检索属性值【英文标题】:Retrieving Attribute Values from a XML string in Java 【发布时间】:2021-05-25 17:42:15 【问题描述】:我有以下 XML 字符串
<Result>
<Component>PEV CR</Component>
<ComponentText xml:lang="pt-BR" />
<ComponentText xml:lang="en-US">PEV CR</ComponentText>
<Item>CR_PEVPARA_BON BAD!</Item>
<ItemText xml:lang="pt-BR">CR_PEVPARA_BON RUIM!</ItemText>
<ItemText xml:lang="en-US">CR_PEVPARA_BON BAD!</ItemText>
<ResultType>State</ResultType>
<ResultText xml:lang="pt-BR" />
<ResultText xml:lang="en-US" />
<ResultState>NotOk</ResultState>
<Type_State>
<ActualString>0</ActualString>
<ReferenceString>1</ReferenceString>
</Type_State>
</Result>
<Result>
<Component>NAV</Component>
<ComponentText xml:lang="pt-BR" />
<ComponentText xml:lang="en-US">NAV</ComponentText>
<Item>ECU NO RESPONSE</Item>
<ItemText xml:lang="pt-BR">SEM RESPOSTA UCE</ItemText>
<ItemText xml:lang="en-US">ECU NO RESPONSE</ItemText>
<ResultType>Execution</ResultType>
<ResultText xml:lang="pt-BR" />
<ResultText xml:lang="en-US" />
<ResultState>NotOk</ResultState>
<Type_Execution />
<DetailTags>
<Nack00.NackTextToTicket>Sem comunicacao UCE (00)</Nack00.NackTextToTicket>
<Nack00.NackTextToStatistic>Nack: 0x7F 0x?? 0x00</Nack00.NackTextToStatistic>
</DetailTags>
</Result>
我想访问,例如,这个标签内的文本
<ItemText xml:lang="pt-BR">SEM RESPOSTA UCE</ItemText>
Java 中是否有像 Selenium 一样以 XPath 方式提供此功能的库?
【问题讨论】:
XML 是不变的还是会改变? .我问的是节点,而不是值 可能重复:https://***.com/questions/2811001/how-to-read-xml-using-xpath-in-java JRE 支持 XPath 1.0,使用 Saxon 9 或 10 您甚至可以使用 XPath 3.1。我首先会担心缺少包含Result
元素的根元素。
这能回答你的问题吗? how to get the attribute value of an xml node using java
【参考方案1】:
你可以使用 jsoup 来做到这一点,它也很简单。请看代码中的cmets
马文:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
测试代码
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class Test
public static void main(String[] args) throws IOException
String s = "<Result>\r\n" +
" <Component>PEV CR</Component>\r\n" +
" <ComponentText xml:lang=\"pt-BR\" />\r\n" +
" <ComponentText xml:lang=\"en-US\">PEV CR</ComponentText>\r\n" +
" <Item>CR_PEVPARA_BON BAD!</Item>\r\n" +
" <ItemText xml:lang=\"pt-BR\">CR_PEVPARA_BON RUIM!</ItemText>\r\n" +
" <ItemText xml:lang=\"en-US\">CR_PEVPARA_BON BAD!</ItemText>\r\n" +
" <ResultType>State</ResultType>\r\n" +
" <ResultText xml:lang=\"pt-BR\" />\r\n" +
" <ResultText xml:lang=\"en-US\" />\r\n" +
" <ResultState>NotOk</ResultState>\r\n" +
" <Type_State>\r\n" +
" <ActualString>0</ActualString>\r\n" +
" <ReferenceString>1</ReferenceString>\r\n" +
" </Type_State>\r\n" +
"</Result>\r\n" +
"<Result>\r\n" +
"<Component>NAV</Component>\r\n" +
"<ComponentText xml:lang=\"pt-BR\" />\r\n" +
"<ComponentText xml:lang=\"en-US\">NAV</ComponentText>\r\n" +
"<Item>ECU NO RESPONSE</Item>\r\n" +
"<ItemText xml:lang=\"pt-BR\">SEM RESPOSTA UCE</ItemText>\r\n" +
"<ItemText xml:lang=\"en-US\">ECU NO RESPONSE</ItemText>\r\n" +
"<ResultType>Execution</ResultType>\r\n" +
"<ResultText xml:lang=\"pt-BR\" />\r\n" +
"<ResultText xml:lang=\"en-US\" />\r\n" +
"<ResultState>NotOk</ResultState>\r\n" +
"<Type_Execution />\r\n" +
"<DetailTags>\r\n" +
" <Nack00.NackTextToTicket>Sem comunicacao UCE (00)</Nack00.NackTextToTicket>\r\n" +
" <Nack00.NackTextToStatistic>Nack: 0x7F 0x?? 0x00</Nack00.NackTextToStatistic>\r\n" +
"</DetailTags>\r\n" +
"</Result>";
Document doc = Jsoup.parse(s);
/*
doc.select("ItemText") - this contains multiple "org.jsoup.nodes.Element" objects
*/
System.out.println(doc.select("ItemText"));
/* above line produces output:
<itemtext xml:lang="pt-BR">
CR_PEVPARA_BON RUIM!
</itemtext>
<itemtext xml:lang="en-US">
CR_PEVPARA_BON BAD!
</itemtext>
<itemtext xml:lang="pt-BR">
SEM RESPOSTA UCE
</itemtext>
<itemtext xml:lang="en-US">
ECU NO RESPONSE
</itemtext>
*/
/*
doc.select("ItemText").get(0) - this contains 1st element of ItemText
But it prints whole of the element, Not just text
*/
System.out.println(doc.select("ItemText").get(0));
/* above line produces output:
<itemtext xml:lang="pt-BR">
CR_PEVPARA_BON RUIM!
</itemtext>
*/
/*
doc.select("ItemText").get(0).text() - this contains 1st element of ItemText
It prints just the text the element holds
*/
System.out.println(doc.select("ItemText").get(0).text());
/* above line produces output:
CR_PEVPARA_BON RUIM!
*/
【讨论】:
以上是关于从 Java 中的 XML 字符串中检索属性值的主要内容,如果未能解决你的问题,请参考以下文章
SAXParser - 从 XML 元素解码值后,仅获得字符长度 126