【问题标题】:How do I remove elements and their children from Xml using Java and Stax如何使用 Java 和 Stax 从 Xml 中删除元素及其子元素
【发布时间】:2014-06-16 16:40:26
【问题描述】:

我有一个包含此类数据的大文件

<releases>
   <release>
   ......
      <companies>
         <company>
         </company>
      </companies>
   </release>
   <release>
   ......
</releases>

我想生成和输出与输入文件相同的文件,但删除了所有公司元素及其子元素。我正在尝试使用 Stax,我认为它会遍历元素,然后如果我得到一个匹配我不能写那个元素,该部分将被删除。即,如果我丢弃导致其中的元素并被删除的元素,但似乎它只是删除了元素本身而不是其他任何东西,对吗?

<releases>
   <release>
   ......
   </release>
   <release>
   ......
</releases>

这是我目前拥有的代码:

        XMLInputFactory  inputFactory = XMLInputFactory.newInstance();
        XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
        InputStream in = new FileInputStream(source);
        XMLEventReader reader = inputFactory.createXMLEventReader(in);

        OutputStream out = new FileOutputStream(target);
        XMLEventWriter writer =  outputFactory.createXMLEventWriter(out);
        XMLEvent event;
        while(reader.hasNext()){
            event = reader.nextEvent();
            writer.add(event);
            if(event.getEventType() == XMLStreamConstants.START_ELEMENT)
            {
                if(event.asStartElement().getName().toString().equalsIgnoreCase("companies"))
                {
                    System.out.println("Deleting:"+event);
                    continue;
                }
                else
                {
                    writer.add(event);
                }
            }
            else
            {
                writer.add(event);
            } 
        }

【问题讨论】:

    标签: java xml stax


    【解决方案1】:

    我想我现在有了,Stax 会逐个元素处理,所以我需要标记何时找到起始元素,设置一个变量以指示在到达结束元素之前应忽略所有后续数据。

    代码示例:

    import javax.xml.stream.*;
    import javax.xml.stream.events.XMLEvent;
    import java.io.*;
    
    public class FixDb
    {
    
        public static void main(String[] args) throws Exception
        {
            File source = new File(args[0]);
            if(!source.exists())
            {
                System.out.println("File:"+source+ " does not exist");
            }
    
            File target = new File(source+".new");
    
            XMLInputFactory  inputFactory = XMLInputFactory.newInstance();
            XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
            InputStream in = new FileInputStream(source);
            XMLEventReader reader = inputFactory.createXMLEventReader(in);
    
            OutputStream out = new FileOutputStream(target);
            XMLEventWriter writer =  outputFactory.createXMLEventWriter(out);
            XMLEvent event;
    
            boolean deleteSection = false;
            while(reader.hasNext())
            {
                event = reader.nextEvent();
                if(event.getEventType() == XMLStreamConstants.START_ELEMENT && event.asStartElement().getName().toString().equalsIgnoreCase("companies"))
                {
                    deleteSection=true;
                    continue;
                }
                else if(event.getEventType() == XMLStreamConstants.END_ELEMENT && (event.asEndElement().getName().toString().equalsIgnoreCase("companies")))
                {
                    deleteSection=false;
                    continue;
                }
                else if(deleteSection)
                {
                    continue;
                }
                else
                {
                    writer.add(event);
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多