2016-02-26 4 views
2

У меня есть XML (на самом деле String), и я хочу найти все теги, которые содержат атрибуты width и height и изменить их значения.Изменить значения атрибутов xml с помощью XmlPullParser

пример 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 значений

Я был в состоянии идентифицировать некоторые из значений с помощью XmlPullParser: код ниже идентифицирует 426 и 640 значений, но не 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(); 
    } 
} 
+0

Вы пробовали с получением и установкой недвижимости? – king

+0

Является ли ваш пример xml полным, я не видел 560. –

+0

560 на самом деле 420. Извините за недоразумение – Paul

ответ

2

XmlPullParser не может изменить значения. Вам нужно разобрать и написать одновременно. Одновременно используйте DomDocument или потоковые читатели и писатели.

DomDocument лучший для вас.

+0

Можете ли вы привести пример использования DomDocument в моем примере? – Paul

0

Это необходимое решение. Я написал это в 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> 
+0

Я попробую это через несколько часов, когда я буду перед ПК – Paul

+0

Это не 100%, что мне нужно, но я понял, используя ваш пример. Благодаря! – Paul

Смежные вопросы