2015-12-07 8 views
0

В нижнем XML-файле у меня есть имя файла и его соответствующие номера правил в hashmap (с именем «ds» в исходном коде) в формате {{file1.c , {1234,3456,5087,9900, ....}}, {file2.c, {1234,3456,5087,9900, ....}}>, если для file1.c любой номер правила в данном списке существует в xml-файле для <QACRule> тега (здесь 5087 соответствует) Я хочу удалить его родительский узел, то есть <Complain> узел.XMLStreamException: Элемент не найден, чтобы написать: ArrayIndexOutOfBoundsException при анализе xml-файла с помощью StAX

<SourceFiles> 
    **<File name="file1.c">** 
     <FileSummary> 
      <QAC> 
       <StatDev>0</StatDev> 
       <StatIntendDev>1</StatIntendDev> 
      </QAC> 
      <Developer> 
       <StatDev>0</StatDev> 
       <StatIntendDev>0</StatIntendDev> 
       <StatBlank>1</StatBlank> 
      </Developer> 
      <Total> 
       <TotalRank>intended deviation</TotalRank> 
       <StatDev>0</StatDev> 
       <StatIntendDev>1</StatIntendDev> 
      </Total> 
     </FileSummary> 
     **<Complain lfd="1">** 
      <Line>43</Line> 
      <Description>"#include statements"</Description> 
      <Rule> 
       **<QACRule>5087</QACRule>** 
       <CodingStd>18.1.</CodingStd> 
       <Deviation>true</Deviation> 
      </Rule> 
      <Ranking> 
       <QACRank>intended deviation</QACRank> 
       <DeveloperRank></DeveloperRank> 
       <TotalRank>intended deviation</TotalRank> 
      </Ranking> 
      <Comment>these includes must stay here at this position</Comment> 
     </Complain> 
     **<Complain lfd="2">** 
      <Line>140</Line> 
      <Description>"#include statements"</Description> 
      <Rule> 
       **<QACRule>55555</QACRule>** 
       <CodingStd>18.1.</CodingStd> 
       <Deviation>true</Deviation> 
      </Rule> 
      <Ranking> 
       <QACRank>intended deviation</QACRank> 
       <DeveloperRank></DeveloperRank> 
       <TotalRank>intended deviation</TotalRank> 
      </Ranking> 
      <Comment>these includes must stay here at this position</Comment> 
     </Complain> 
    </File> 
    <File name="file2.c> 
     ...... 
    </File> 
</SourceFiles>   

, но я не понимая вещь, что после проверки <QACRule> значение в HashMap, как я могу идти выше и удалить <Complain> узел?

Я попытался следующий код Java:

inFactory = XMLInputFactory.newInstance(); 
outFactory= XMLOutputFactory.newInstance(); 
eventReader = inFactory.createXMLEventReader(new FileReader(inputFilePath)); 
out=new FileOutputStream("C:\\Users\\uidg8154\\Desktop\\new.xml"); 
eventWriter= outFactory.createXMLEventWriter(out); 
while(eventReader.hasNext()){ 
    XMLEvent event=eventReader.nextEvent(); 

    if(event.isStartElement() && event.asStartElement().getName().getLocalPart().equalsIgnoreCase("SourceFiles")){ 
     isSourceFileParent=true;  
     System.out.println("-------start of <SourceFies>---------"); 
     srcFiles=new SourceFiles(); 
    } 

    if(event.isEndElement() && event.asEndElement().getName().getLocalPart().equalsIgnoreCase("SourceFiles")){ 
     isSourceFileParent=false; 
     System.out.println("-------end of <SourceFies>---------"); 

    } 

    if(isSourceFileParent==true && event.isStartElement() && event.asStartElement().getName().getLocalPart().equalsIgnoreCase("File")){ 
      fileNameValue=event.asStartElement().getAttributeByName(new QName("name")).getValue(); 
     System.out.println(fileNameValue); 
     sourceFileNamesFromInputXml.add(fileNameValue); 
    } 

    if(isSourceFileParent==true && event.isStartElement() && event.asStartElement().getName().getLocalPart().equalsIgnoreCase("Complain")){ 
     complainIdValue=event.asStartElement().getAttributeByName(new QName("lfd")).getValue(); 
     System.out.println(complainIdValue); 
    } 

    if(isSourceFileParent==true && event.isStartElement() && event.asStartElement().getName().getLocalPart().equalsIgnoreCase("QACRule")){ 
     event = eventReader.nextEvent(); 
     isQacRuleParent=true; 
     isProceed=true; 
     qacRuleNoValue=event.asCharacters().getData(); 
    } 

    if(ds.containsKey(fileNameValue) && isProceed==true){ 
     qacRuleNos=ds.get(fileNameValue); 
     if(qacRuleNos.contains(qacRuleNoValue)){ 
      isIgnoreComplainNode=true; 
     } 
    } 

    if (isSourceFileParent==true && event.isEndElement() && event.asEndElement().getName().getLocalPart().equals("Complain") && isIgnoreComplainNode==true) { 
     isIgnoreComplainNode=false; 
    } 

    if(isIgnoreComplainNode==false){ 
     System.out.println(event); 
     eventWriter.add(event); 
    } 
}//end of while 
eventWriter.flush(); 
eventWriter.close(); 

с этим кодом, я лицом "javax.xml.stream.XMLStreamException: не было найдено ни одного элемента, чтобы написать: java.lang.ArrayIndexOutOfBoundsException: -1" исключение и явно записанный выходной файл.

ответ

0

Вы выполняете синтаксический анализ и запись одновременно, вам может потребоваться обработать немного больше контекста. Когда вы обнаружили, что isIgnoreComplainNode=true, это уже слишком поздно, как вы уже писали о выходе событие, соответствующее:

<Complain lfd="1"> 
     <Line>43</Line> 
     <Description>"#include statements"</Description> 
     <Rule> 
      <QACRule> 

Если вы хотите, чтобы избежать этих событий в вашей продукции, вы должны собрать события между <Complain> открытия до </Complain> замыкание в списке, когда вы достигнете <Complain> окончания: проверить isIgnoreComplainNode:

  • если ложно, а затем добавить все события списка в eventWriter (в том же порядке)
  • если это правда, ничего не делать,

удалить список и продолжить разбор.

Главный вопрос: «Как я могу избежать написания нежелательного узла <Complain> в моем представлении« что », как я могу идти выше и удалять узел <Complain>». Если вы отправите событие в eventWriter, слишком поздно возвращаться.

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

  • Нет связанных вопросов^_^