从xml java中提取字符串

从xml java中提取字符串,java,xml,xml-parsing,Java,Xml,Xml Parsing,我从客户端接收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" T

我从客户端接收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>
我使用了
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 */
我引用了这两个链接,但没有得到太多的帮助


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

,听起来好像在
前面有一些禁止字符。确保文件正确保存为UTF-8,并且声明前没有空格

要解析属性,在这个简单的例子中,我建议使用SAX解析器:

公共类MySaxHandler扩展了DefaultHandler{
公共静态void main(字符串[]args)抛出可丢弃的{
字符串sXMLData=“\r\n”
+“\r\n”
+“\r\n”
+“\r\n”+”;
InputSource source=新的InputSource(新的StringReader(sXMLData));
XMLReader=XMLReaderFactory.createXMLReader();
setContentHandler(新的MySaxHandler());
reader.parse(源代码);
}
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、,
属性(atts)引发SAXException{
if(qName.equals(“Esp:Transaction”)){
对于(int i=0;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"

您的XPath是错误的。您要求XPath提供元素的内容,该元素实际上是空的。为了获取属性,您需要单独获取它们:

/Esp:Interface/Esp:Transaction/@ActionCode

或者你可以一次把它们都弄到手

/Esp:Interface/Esp:Transaction/@*


但这将为您提供文档中的一组节点,每个节点都有一个名称和一个值,您必须在代码中提取这些名称和值。据我所知,没有办法只获取文档中显示的属性字符串。

检查此项,我可以删除这些字符。然后呢?如何调用
startElement
方法?实际上,我想将它合并到我的项目中,即SAX解析器API。注意这一行:
reader.setContentHandler(新的MySaxHandler())。这里,
ContentHandler
被注册到
XMLReader
。然后调用方法
parse()
,该方法在内部为每个元素调用
startElement()
。@MoritzPetersen我正在将
XMLData
传递给其他类静态方法
public static void ParseXMLString(String sXMLData)
此类没有
main
此行将如何更改
reader.setContentHandler(新的MySaxHandler())我的实现只是众多实现之一。此实现不需要
main
方法。我对你的代码一无所知。现在你的任务是解决这个问题。祝你好运提示:您需要实现
ContentHandler
或扩展
DefaultHandler
,但这不一定只是一个类。
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"