如何解析 xml 并从 xml 字符串中获取数据?

Posted

技术标签:

【中文标题】如何解析 xml 并从 xml 字符串中获取数据?【英文标题】:How to parse xml and get the data from xml string? 【发布时间】:2017-07-25 07:54:48 【问题描述】:

我得到一个 xml 字符串,我想解析并从中获取数据。我试图将其解析为 json,但结果是空括号。

public class ResultsActivity extends Activity 

    String outputPath;
    TextView tv;
    public static int PRETTY_PRINT_INDENT_FACTOR = 4;
    public static String TEST_XML_STRING;
    DocumentBuilder builder;
    InputStream is;
    Document dom;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        tv = new TextView(this);
        setContentView(tv);

        String imageUrl = "unknown";

        Bundle extras = getIntent().getExtras();
        if( extras != null) 
            imageUrl = extras.getString("IMAGE_PATH" );
            outputPath = extras.getString( "RESULT_PATH" );
        

        // Starting recognition process
        new AsyncProcessTask(this).execute(imageUrl, outputPath);
    

    public void updateResults(Boolean success) 
        if (!success)
            return;
        try 
            StringBuffer contents = new StringBuffer();

            FileInputStream fis = openFileInput(outputPath);
            try 
                Reader reader = new InputStreamReader(fis, "UTF-8");
                BufferedReader bufReader = new BufferedReader(reader);
                String text = null;
                while ((text = bufReader.readLine()) != null) 
                    contents.append(text).append(System.getProperty("line.separator"));
                
             finally 
                fis.close();
            
        XmlToJson xmlToJson = new XmlToJson.Builder(contents.toString()).build();

// convert to a JSONObject
            JSONObject jsonObject = xmlToJson.toJson();

// OR convert to a Json String
            String jsonString = xmlToJson.toString();

// OR convert to a formatted Json String (with indent & line breaks)
            String formatted = xmlToJson.toFormattedString();
            Log.e("xml",contents.toString());
            Log.e("json",jsonObject.toString());


         catch (Exception e) 
            displayMessage("Error: " + e.getMessage());
        
    


    public void displayMessage( String text )
    
        tv.post( new MessagePoster( text ) );
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_results, menu);
        return true;
    

    class MessagePoster implements Runnable 
        public MessagePoster( String message )
        
            _message = message;
        

        public void run() 
            tv.append( _message + "\n" );
            setContentView( tv );
        

        private final String _message;
    

我点击了这个链接:https://github.com/smart-fun/XmlToJson

我只能解析 xml 吗?如何从 xml 字符串中获取数据?

下面是xml字符串:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd" xmlns="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd">
 <businessCard imageRotation="noRotation">
   <field type="Mobile">
     <value>•32147976</value>
   </field>
   <field type="Address">
     <value>Timing: 11:00 a.m. to 5.00 p.m</value>
   </field>
   <field type="Address">
     <value>MULTOWECIALITY HOSPITAL Havnmg Hotel MwyantfwfMf), TOL: 1814 7»7» / 0454 7575 fax: 2514 MSS MtoMte t wvHwJaMtur0Mapttal.com</value>
   </field>
   <field type="Name">
     <value>M. S. (Surgery), Fais, Fics</value>
   </field>
   <field type="Company">
     <value>KASTURI MEDICARE PVT. LTD.</value>
   </field>
   <field type="Job">
     <value>Consulting General Surgeon Special Interest: Medical Administrator: KsturiSecretary: IMA - Mira</value>
   </field>
   <field type="Text">
     <value>Mob.: •32114976
   Dr. Rakhi R
   M. S. (Surgery),  Surgeon
   Special Interest:                               Medical
   President: Bhayander Medical Association
   Scientific Secretary: IMA - Mira Bhayander
   Timing: 11:00 a.m. to 5.00 p.m
   %
   *
   KASTURI MEDICARE PVT. LTD.
   ISO 9001:2008 Certified, ASNH Cliniq 21 Certified,
   MtoMte t wvHwJaMtur0Mapttal.com
   mkhLkasturi0gmoiH.com</value>
   </field>
 </businessCard>

我检查了这个链接来解析 xml:http://androidexample.com/XML_Parsing_-_Android_Example/index.php?view=article_discription&aid=69

但是这个字符串没有列表,我不知道如何解析这个 xml 字符串。有人可以帮忙吗??谢谢。。

【问题讨论】:

我会给你建议,把它转换成Json,然后解析JsonObject。这比解析 XML 容易。 在android中使用XML PullParser解析XML。 这是一个关于使用 Json 解析数据的完整示例,它可能会有所帮助:androidhive.info/2014/07/… 【参考方案1】:

你可以比XML更容易地解析Json

所以我会建议你解析Json,

首先将XML转换为Json,然后解析JsonObject

这里是您可以逐步将 XML 转换为 JSON 的参考

https://***.com/a/18339178/6676466

【讨论】:

我试过这个,结果是空括号。 我已经测试过这段代码。它对我来说很完美...您的 xml 数据会有问题..您可以发布您的 xml 数据...吗? 知道了,谢谢.. 你能帮忙解决这个问题吗? ***.com/questions/42612426/… 我很高兴,:) @Sid 我已经回答了您的上述问题。请检查。 ***.com/a/42618406/6676466【参考方案2】:

对于 Xml 解析,您可以选择 XML Pull Parser 或 XML DOM Parser。 这两个过程都相当冗长,并且涉及大量代码,因为它侧重于手动解析 XML。

另一种方法是在您的项目中使用This Library,然后您的大部分工作就完成了。它将解析您的 XML,就像您使用 GSON 解析 JSON 一样。 您需要做的就是创建解析器的一个实例并像这样使用它:

 XmlParserCreator parserCreator = new XmlParserCreator() 
    @Override
    public XmlPullParser createParser() 
      try 
        return XmlPullParserFactory.newInstance().newPullParser();
       catch (Exception e) 
        throw new RuntimeException(e);
      
    
  ;

  GsonXml gsonXml = new GsonXmlBuilder()
     .setXmlParserCreator(parserCreator)
     .create();

  String xml = "<model><name>my name</name><description>my description</description></model>";
  SimpleModel model = gsonXml.fromXml(xml, SimpleModel.class);

请记住,您需要为响应创建一个 POJO 类,就像为 GSON 所做的那样。

使用以下方法将库包含在您的 gradle 中:

compile 'com.stanfy:gson-xml-java:0.1.+'

请仔细阅读库的 github 链接以了解用法和限制。

【讨论】:

【参考方案3】:

从您的问题中,我没有得到将 xml 转换为 json 的理由,而只是为了获得一种直接从 xml 中获取某些字段的方法。

如果后续步骤不需要处理 json 数据,我建议您使用 XPATH。使用 Xpath,您可以通过简单的路径查询(例如“/document/businessCard/field[@type='Mobile']/value”)获取 xml 的数据

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(URI_TO_YOUR_DOCUMENT);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("/document/businessCard/field[@type='Mobile']/value");

【讨论】:

我怎样才能得到这个字符串?

以上是关于如何解析 xml 并从 xml 字符串中获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何单击元素并从链接的 xml 文件(python)中解析文本?

如何在 android 中获取 XML 响应字符串以及 Kotlin 数据模型?

尝试删除存在的文件时出错

如何从Element获取原始xml作为字符串

黑莓:解析 XML 时如何获取 Node 的原始内容

如何从网站以 xml 格式获取数据并使用 Objective-c 解析该数据以执行操作