【问题标题】:extract string from xml java从xml java中提取字符串
【发布时间】:2013-08-28 23:08:01
【问题描述】:

我从客户端收到 XML 字符串

<?xml version="1.0" encoding="UTF-8"?>
<Esp:Interface Version="1.0" xmlns:Esp="http://***Confidential****/">
<Esp:Transaction ActionCode="APPROVE" CardNumber="474849********28" ExpiryDate="0824" 
    ResponseCode="00" TerminalId="03563001" Track2="474849********28=08241261234" 
    TransactionAmount="300" TransactionId="00051" Type="PURCHASE" LocalDate="0823" 
    LocalTime="152006" PosOperatorId="1234" AuthorizationNumber="123456" MessageType="REFERAL">
</Esp:Transaction>
</Esp:Interface>

我想像这样提取每个字符串

ActionCode="APPROVE" 
CardNumber="474849********28" 
ExpiryDate="0824" 
ResponseCode="00" 
TerminalId="03563001" 
Track2="474849********28=08241261234" 
TransactionAmount="300" 
TransactionId="00051" 
Type="PURCHASE" 
LocalDate="0823" 
LocalTime="152006" 
PosOperatorId="1234" 
AuthorizationNumber="123456" 
MessageType="REFERAL"

我使用XPath 读取 XML 字符串,但它给了我错误

InputSource source = new InputSource(new StringReader(sXMLData));//sXMLData Contains XML String     

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(source);

XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();

String msg = xpath.evaluate("/Esp:Interface/Esp:Transaction", document);

System.out.println("msg= " + msg);

错误:

msg : /* Coming Blank */

我参考了这两个链接,但没有得到太多帮助 Parse XML Simple String using Java XPathSimplest way to query XML in Java

如何从 XML 中获取这些单独的字符串...通过使用内置 XML 或旧的 substring 方法(低效)

【问题讨论】:

标签: java xml xml-parsing


【解决方案1】:

您的 XPath 错误。您正在向 XPath 询问元素的内容,该内容确实是空的。为了获取属性,您需要单独获取它们:

/Esp:Interface/Esp:Transaction/@ActionCode

或者你可以一次得到它们

/Esp:Interface/Esp:Transaction/@*

但这会给您文档中的一组节点,每个节点都有一个名称和一个值,您必须在代码中提取它们。我不知道只获取文档中出现的属性字符串。

【讨论】:

    【解决方案2】:

    听起来你在&lt;?xml ...?&gt; 之前有一些禁止使用的字符。确保文件正确保存为 UTF-8 并且声明前没有空格。

    为了解析属性,在这个简单的例子中,我推荐一个 SAX 解析器:

    public class MySaxHandler extends DefaultHandler {
        public static void main(String[] args) throws Throwable {
            String sXMLData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
                    + "<Esp:Interface Version=\"1.0\" xmlns:Esp=\"http://***Confidential****/\">\r\n"
                    + "<Esp:Transaction ActionCode=\"APPROVE\" CardNumber=\"474849********28\" ExpiryDate=\"0824\" \r\n"
                    + "    ResponseCode=\"00\" TerminalId=\"03563001\" Track2=\"474849********28=08241261234\" \r\n"
                    + "    TransactionAmount=\"300\" TransactionId=\"00051\" Type=\"PURCHASE\" LocalDate=\"0823\" \r\n"
                    + "    LocalTime=\"152006\" PosOperatorId=\"1234\" AuthorizationNumber=\"123456\" MessageType=\"REFERAL\">\r\n"
                    + "</Esp:Transaction>\r\n" + "</Esp:Interface>";
            InputSource source = new InputSource(new StringReader(sXMLData));
            XMLReader reader = XMLReaderFactory.createXMLReader();
            reader.setContentHandler(new MySaxHandler());
            reader.parse(source);
        }
    
        @Override
        public void startElement(String uri, String localName, String qName,
                  Attributes atts) throws SAXException {
            if (qName.equals("Esp:Transaction")) {
                for (int i = 0; i < atts.getLength(); i++) {
                    System.out.println(atts.getQName(i) + "=\"" + atts.getValue(i) + "\"");
                }
            }
        }
    }
    

    给出这个输出:

    ActionCode="APPROVE"
    CardNumber="474849********28"
    ExpiryDate="0824"
    ResponseCode="00"
    TerminalId="03563001"
    Track2="474849********28=08241261234"
    TransactionAmount="300"
    TransactionId="00051"
    Type="PURCHASE"
    LocalDate="0823"
    LocalTime="152006"
    PosOperatorId="1234"
    AuthorizationNumber="123456"
    MessageType="REFERAL"
    

    【讨论】:

    • 我可以删除那些字符..然后呢?
    • 如何调用startElement 方法?其实我想把它合并到我的项目中
    • 这就是 SAX 解析器 API。请注意这一行:reader.setContentHandler(new MySaxHandler());。在这里,ContentHandler 注册到XMLReader。然后调用parse()方法,它在内部为每个元素调用startElement()
    • @MoritzPetersen 我将XMLData 传递给其他类静态方法public static void ParseXMLString(String sXMLData) 这个类没有main 这一行将如何改变reader.setContentHandler(new MySaxHandler());
    • 我的实现只是众多实现之一。此实现不需要main 方法。我对你的代码一无所知。现在你的任务是解决这个问题。祝你好运! -- 提示:你需要实现一个ContentHandler或扩展一个DefaultHandler,但这不一定只有一个类。
    猜你喜欢
    • 2013-05-02
    • 2013-07-22
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多