如何从Unziped文件中获取XML值

时间:2016-03-20 16:43:05

标签: java xml iteration

我需要获得像“符号”等的价值。从xml文件发送到列表。

现在我的代码看起来像这样:

Scanner sc = null;

    byte[] buff = new byte[1 << 13];
    List<String> question2 = new ArrayList<String>();
    question2 = <MetodToGetFile>(sc,fileListQ);
    for ( String strLista : question2){
    ByteArrayInputStream in = new ByteArrayInputStream(strLista.getBytes());
    try(InputStream reader = Base64.getMimeDecoder().wrap(in)){
    try (GZIPInputStream gis = new GZIPInputStream(reader)) {
    try (ByteArrayOutputStream out = new ByteArrayOutputStream()){
            int readGis = 0;
            while ((readGis = gis.read(buff)) > 0)
                out.write(buff, 0, readGis);
            byte[] buffer = out.toByteArray();
            String s2 = new String(buffer);
     }
    }
   }
  }
 }

我想知道我怎样才能将这个和值“xxx”和“zzzz”放在另一个列表中,因为我需要获得一些价值。

XML看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Name Name="some value">
<Group Names="some value">
<Package Guid="{7777-7777-7777-7777-7777}">
  <Attribute Typ="" Name="Symbol">xxx</Attribute>
  <Attribute Type="" Name="Surname">xxx</Attribute>
  <Attribute Type="Address" Name="Name">zzzz</Attribute>
  <Attribute Type="Address" Name="Country">zzzz</Attribute>
</Package>

编辑:您好,我希望我的解决方案对某人有用:)

try{
         //Get is(inputSource with xml in s2(xml string value from stream)
                InputSource is = new InputSource(new StringReader(s2));

                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                Document doc = db.parse(is);
                XPathFactory xpf = XPathFactory.newInstance();
                XPath xpath = xpf.newXPath();
                //Get "some value" from attribut Name
                String name= (String) xpath.evaluate("/Name/@Name", doc, XPathConstants.STRING);
                //Get "guid" from attribute guid
                String guid= (String) xpath.evaluate("/Name/Group/Package/@Guid", doc, XPathConstants.STRING);
                //Get element xxx by tag value Symbol
                String symbol= xpath.evaluate("/Name/Group/Package/Attribute[@Name=\"Symbol\"]", doc.getDocumentElement());
                System.out.println(name);
                System.out.println(guid);
                System.out.println(symbol);
                }catch(Exception e){
                    e.printStackTrace();
                }

如果我能通过我的代码帮助某人,我会很高兴:)

1 个答案:

答案 0 :(得分:0)

添加这样的方法来检索与给定路径表达式匹配的所有元素:

public List<Node> getNodes(Node sourceNode, String xpathExpresion) throws XPathExpressionException {
    // You could cache/reuse xpath for better performance 
    XPath xpath = XPathFactory.newInstance().newXPath();
    NodeList nodes = (NodeList) xpath.evaluate(xpathExpresion,sourceNode,XPathConstants.NODESET);
    ArrayList<Node> list = new ArrayList<Node>();
    for(int i = 0; i < nodes.getLength(); i++) {
        Node node = nodes.item(i);
        list.add(node);
    }
    return list;
}

添加另一种方法从XML输入构建Document:

public Document buildDoc(InputStream is) throws Exception {
    DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
    DocumentBuilder parser = fact.newDocumentBuilder();
    Document newDoc = parser.parse(is);
    newDoc.normalize();
    is.close();
    return newDoc;
}

然后把它们放在一起:

InputSource is = new InputSource(new StringReader("... your XML string here"));
Document doc = buildDoc(is);
List<Node> nodes = getNodes(doc, "/Name/Group/Package/Attribute");
for (Node node: nodes) {
    // for the text body of an element, first get its nested Text child
    Text text = node.getChildNodes().item(0);
    // Then ask that Text child for it's value
    String content = node.getNodeValue();
}

我希望我能正确地复制和粘贴它。我在我的一个开源项目中从a working class中提取了这个并清理了一下以回答您的具体问题。