【问题标题】:Can't get needed output after XML parsingXML解析后无法获得所需的输出
【发布时间】:2015-12-12 00:49:11
【问题描述】:

我是 Java 新手。 想要一些建议。 所以,我正在解析 Xml 文件中的数据,并将其添加到 hashMap。 请看一段代码:

final HashMap<String,String> urls = new HashMap<String,String>();

        File products = new File("D:/eclipse/workspace/test/src/main/resources/Products.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder;

        dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(products);
        doc.getDocumentElement().normalize();

        NodeList nList = doc.getElementsByTagName("Row");                       
        for (int z=0; z<nList.getLength(); z++) {
        Node nNode = nList.item(z);
        Element eElement = (Element) nNode; 

        NodeList a = eElement.getElementsByTagName("item");
        for (int i=0; i<a.getLength(); i++) {                               
            String b = eElement.getElementsByTagName("item").item(i).getTextContent();
            String c = eElement.getElementsByTagName("url").item(i).getTextContent();           
            urls.put(b, c);
            System.out.println(urls);                               
                }
            }

这是我在控制台中 println 后的 hashMap 输出:

{Select product=bla-bla-bla}
{Single Landmine Shirt=http://www.sample.com/landmine-single-shirt, Select product=bla-bla-bla}
{Women's Silver & Black Bar=http://www.sample.com/womens-silver-and-black-bar, Single Landmine Shirt=http://www.sample.com/landmine-single-shirt, Select product=bla-bla-bla}

如您所见,我在 for-cycle 的每次下一次迭代中都有一组渐进式项目:(。但我真正需要的只是 key(item tag)=value(url 标记)对。"item""url" - 是我的 XML 中的标记(请参阅附件)。

我想要这样的输出(只有一个键和一个对应的值):

{Select product=bla-bla-bla}
{Single Landmine Shirt=http://www.sample.com/landmine-single-shirt}
{Women's Silver & Black Bar=http://www.sample.com/womens-silver-and-black-bar}
{High Density Foam Rollers=http://www.sample.com/high-density-foam-rollers}

如何更新代码以获得正确的键值对? 会很高兴得到任何答案。非常感谢你!

【问题讨论】:

  • 1) System.out.println("{" + b + "=" + c + "}"); --- 或者 2) 将 println() 方法移到循环外。
  • 调用normalize()不会影响结果,所以是对CPU周期的浪费。 getTextContent() 将在需要时合并文本内容。
  • @Andreas,谢谢。由于我需要在 hashMap 中存储值并进一步使用它,因此您的建议 2) 似乎适合这里。我很感激你的回答。

标签: java xml xml-parsing hashmap


【解决方案1】:

你得到的是正常的。我解释一下:

  • 您通过迭代项目来填充您的地图
  • 然后您在每一步都打印此地图。​​

然后,因为您只需要 item=url 一次,我建议:

解决方案1:不要为此使用您的地图(如果以后想使用它,请保留它),只需替换

urls.put(b, c);
System.out.println(urls);  

by

 System.out.println("{"+b+"="+c+"}");

解决方案 2:保留地图,但只需将 println 移到循环之外

你将拥有一次

{Women's Silver & Black Bar=http://www.sample.com/womens-silver-and-black-bar, Single Landmine Shirt=http://www.sample.com/landmine-single-shirt, Select product=bla-bla-bla}

这取决于您选择的格式

【讨论】:

  • 所以是的,我需要确定地保留地图。解决方案 2 对我有用。非常感谢! :) 我在这里有一个小问题:现在它存储在 line(String) 视图中,如您在答案中描述的那样,我的意思是 {item=url, item2=url2, etc.} 我的问题:是否可以成对存储值列视图? - 像这样:{item=utl} \n {item2=utl2} \n {item3=utl3} \n 等等...谢谢!
  • @EvgEvg,其实不是保持在行,或者列,有一个内部结构。如果您想逐行打印,只需阅读如何迭代地图:stackoverflow.com/questions/46898/…
【解决方案2】:

试试这个:

final HashMap<String, String> urls = new HashMap<String, String>();

File products = new File("D:/eclipse/workspace/test/src/main/resources/Products.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;

dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(products);
doc.getDocumentElement().normalize();

NodeList rowsList = doc.getElementsByTagName("Row");
for(int z = 0; z < rowsList.getLength(); z++)
{
    Node rowNode = rowsList.item(z);
    NodeList rowNodeChildren = rowNode.getChildNodes();
    String item = null;
    String url = null;
    for(int i = 0; i < rowNodeChildren.getLength(); i++)
    {
        Node rowNodeChild = rowNodeChildren.item(i);
        if("item".equals(rowNodeChild.getNodeName()))
        {
            item = rowNodeChild.getTextContent();
        }
        else if("url".equals(rowNodeChild.getNodeName()))
        {
            url = rowNodeChild.getTextContent();
        }
    }
    urls.put(item, url);
}

【讨论】:

  • 这对我的代码来说是一个很好的更新,Josh。谢谢!正如我从功能方面看到的那样 - 您的代码结果与我的相同。无论如何,我从其他答案中得到了什么:解决方案 - 只是将 println 移到循环之外。再次非常感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
相关资源
最近更新 更多