从 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>

我想访问,例如,这个标签内的文本

&lt;ItemText xml:lang="pt-BR"&gt;SEM RESPOSTA UCE&lt;/ItemText&gt;

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

如何有效地从大型 Excel 文档中检索所有字符串

从javascript中的localstorage中检索多个字符串值

java中如何从Color属性字符串中获取颜色Color

使用 javascript 从 XML 字符串中获取节点值

使用正则表达式从字符串中删除属性值不是特定值的所有 xml 节点