3

XML (実際には) があり、属性を含むすべてのタグを検索し、それらの値を変更しStringたいと考えています。widthheight

XML の例:

<div>
<div class="separator" style="clear: both; text-align: center;">
    <a href="http://1.bp.blogspot.com/-b5iKjQ5ivZQ/VOoBX9NinU3232I/AAAAAAAADZU332/zq3apERWFms/s800/IMG_3426.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
        <img border="0" height="426" src="http://1.bp.blogspot.com/-b5iKjQ5ivZQ/VOoBX9NinUI/AAAAAAAADZU/zq32323apERWFms/s800/IMG_3426.JPG" width="640" />
    </a>
</div>
<div class="separator" style="clear: both; text-align: center;">
    <iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/sI9Qf7UmXl0" width="420"></iframe>
</div>

上記の例では、次のように変更します。

  • 426 および 640 の値
  • 560 および 315 の値

以下のコードは、426 と 640の値をXmlPullParser識別しますが、560 と 315 は識別しません。また、XML でそれらを変更する方法もわかりません。

public void parse(String inputString) throws XmlPullParserException, IOException {
    XmlPullParser parser = Xml.newPullParser();
    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
    parser.setInput(new StringReader(inputString));
    parser.nextTag();
    readXml(parser);
}

private void readXml(XmlPullParser parser) throws XmlPullParserException, IOException {
    int eventType = parser.getEventType();
    while (eventType != XmlPullParser.END_DOCUMENT) {
        switch (eventType) {
            case XmlPullParser.START_TAG:
                break;

            case XmlPullParser.END_TAG:
                String h = parser.getAttributeValue(null, "height");
                String w = parser.getAttributeValue(null, "width");
                if (!TextUtils.isEmpty(h) && !TextUtils.isEmpty(w)) {
                    // TODO: need to change here h and w values in XML
                }
                break;
        }
        eventType = parser.next();
    }
}
4

2 に答える 2

2

XmlPullParser は値を変更できません。解析と書き込みを同時に行う必要があります。DomDocument またはストリーム ベースのリーダーとライターを同時に使用します。

DomDocument はあなたに最適です。

于 2016-03-03T11:35:37.637 に答える
1

これが必要なソリューションです。これはJAVAで書いていますが、ちょっとした変更でandroidでも使えます。ファイルに加えたい変更を書いていないので、2 を掛けると仮定しましたが、それも変更できます。

private static Document doc = null;
public static void main(String[] args) {
    try {   
        String s = "<File>\n" +
                "<div class=\"separator\" style=\"clear: both; text-align: center;\">\n" +
                "    <a href=\"http://1.bp.blogspot.com/-b5iKjQ5ivZQ/VOoBX9NinU3232I/AAAAAAAADZU332/zq3apERWFms/s800/IMG_3426.JPG\" imageanchor=\"1\" style=\"margin-left: 1em; margin-right: 1em;\">\n" +
                "        <img border=\"0\" height=\"426\" src=\"http://1.bp.blogspot.com/-b5iKjQ5ivZQ/VOoBX9NinUI/AAAAAAAADZU/zq32323apERWFms/s800/IMG_3426.JPG\" width=\"640\" />\n" +
                "    </a>\n" +
                "</div>\n" +
                "<div class=\"separator\" style=\"clear: both; text-align: center;\">\n" +
                "    <iframe allowfullscreen=\"\" frameborder=\"0\" height=\"315\" src=\"https://www.youtube.com/embed/sI9Qf7UmXl0\" width=\"420\"></iframe>\n" +
                "</div>\n" +
                "</File>";
         InputStream stream = new ByteArrayInputStream(s.getBytes(StandardCharsets.UTF_8));
         DocumentBuilderFactory dbFactory 
            = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

         doc = dBuilder.parse(stream);
         doc.getDocumentElement().normalize();

         Element root = doc.getDocumentElement();

         //First, browse the children and modify the required attributes
         browseChildNodesAndModifyValue(root);

         //Now, write to a file, or do something with it
         writeDomToFile();

      } catch (Exception e) {
         e.printStackTrace();
      }


}

private static void browseChildNodesAndModifyValue(Node parent){
    NodeList nodeList = parent.getChildNodes();

    if(nodeList.getLength() > 0){
        for(int temp = 0; temp< nodeList.getLength(); temp++){
            Node node = nodeList.item(temp);
            browseChildNodesAndModifyValue(node);
        }
    }else{
        NamedNodeMap nodeMap = parent.getAttributes();

        if(nodeMap == null) return;

        for(int temp2=0; temp2< nodeMap.getLength(); temp2++){
            Node n = nodeMap.item(temp2);
            String attributeName = n.getNodeName();

            if(attributeName.equals("height")){
                int height = Integer.parseInt(n.getNodeValue());
                System.out.println("Height = "+height);

                //Modify the height here. e.g. I will multiply by 2
                n.setNodeValue(String.valueOf(height*2));
            }else if(attributeName.equals("width")){
                int width = Integer.parseInt(n.getNodeValue());
                System.out.println("width = "+width);

                //Modify the width here. e.g. I will multiply by 2
                n.setNodeValue(String.valueOf(width*2));
            }

        }
    }
}

private static void writeDomToFile() throws TransformerException{
    TransformerFactory transformerfactory=
            TransformerFactory.newInstance();
    Transformer transformer=
            transformerfactory.newTransformer();

    DOMSource source=new DOMSource(doc);

    StreamResult result=new StreamResult(new File("C:\\abc.xml"));

    /*
     * For Android, you can use this :

        FileOutputStream _stream=getApplicationContext().openFileOutput("NewDom.xml", getApplicationContext().MODE_WORLD_WRITEABLE);
        StreamResult result=new StreamResult(_stream);

     */

    transformer.transform(source, result);
}

そして、私が受け取った出力ファイルは次のとおりです。

<File>
<div class="separator" style="clear: both; text-align: center;">
    <a href="http://1.bp.blogspot.com/-b5iKjQ5ivZQ/VOoBX9NinU3232I/AAAAAAAADZU332/zq3apERWFms/s800/IMG_3426.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
        <img border="0" height="852" src="http://1.bp.blogspot.com/-b5iKjQ5ivZQ/VOoBX9NinUI/AAAAAAAADZU/zq32323apERWFms/s800/IMG_3426.JPG" width="1280"/>
    </a>
</div>
<div class="separator" style="clear: both; text-align: center;">
    <iframe allowfullscreen="" frameborder="0" height="630" src="https://www.youtube.com/embed/sI9Qf7UmXl0" width="840"/>
</div>
</File>
于 2016-03-04T10:20:04.083 に答える