-2

I have the following XML file

<?xml version="1.0" encoding="UTF-8" >
<devices>
<cryptoDevice>
    <waveform display="MILSTD" name="MILSTD">
        <dataRates>
            <dataRate interleavers="Z,S,L" value="75C"/>
            <dataRate interleavers="Z,S,L" value="150C"/>
            <dataRate interleavers="Z,S,L" value="300C"/>
            <dataRate interleavers="Z,S,L" value="600C"/>
            <dataRate interleavers="Z,S,L" value="1200C"/>
            <dataRate interleavers="Z,S,L" value="2400C"/>  
            <dataRate interleavers="Z,S" value="2K4VC"/>
            <dataRate interleavers="" value="4800U"/>   
        </dataRates>
    </waveform>
    <waveform display="HDR" name="HDR">
        <dataRates>
            <dataRate interleavers="US,VS,S,M,L,VL" value="3200C"/>
            <dataRate interleavers="US,VS,S,M,L,VL" value="4800C"/>
            <dataRate interleavers="US,VS,S,M,L,VL" value="6400C"/>
            <dataRate interleavers="US,VS,S,M,L,VL" value="8000C"/>
            <dataRate interleavers="US,VS,S,M,L,VL" value="9600C"/>
            <dataRate interleavers="" value="12.8KU"/>
        </dataRates>
    </waveform>
 </cryptoDevice>    
 <modem name="ARM-1191">
      <waveform>4</waveform>
       <dataRate>2</dataRate>
       <interleaver>3</interleaver>
</modem>
<modem name="ARM-1192">
    <waveform>10</waveform>
    <dataRate>2</dataRate>
    <interleaver>3</interleaver>
</modem>
<modem name="ETM-1193">
     <waveform>10</waveform>
     <dataRate>2</dataRate>
      <interleaver>3</interleaver>
</modem>
<modem name="ETM-1194">
    <waveform>10</waveform>
    <dataRate>2</dataRate>
     <interleaver>3</interleaver>
</modem></devices>

I would like to modifiy the waveform , dataRate and Interleaver of the modem with name attribute ARM-1191 . But my code is not working.

Here is the code I have written :

public class ModifyXmlFile
{

/**
 * @param args
 * @throws ParserConfigurationException
 * @throws IOException
 * @throws SAXException
 * @throws TransformerException
 */
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException
{

    // File Path
    String filePath = "Modems.xml";

    // Read XML file.
    File inputFile = new File(filePath);

    // Create DocumentBuilderFactory object.
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();

    // Get DocumentBuilder object.
    DocumentBuilder dbuilder = dbFactory.newDocumentBuilder();

    // Parse XML file.
    Document document = dbuilder.parse(inputFile);

    // Get the root element
    Node devices = document.getFirstChild();

    // // Get element by tag name.
    // Node devices = document.getElementsByTagName("devices").item(0);

    // Get devices element list.
    NodeList modemList = devices.getChildNodes();

    // Loop the modem child node

    for (int i = 0; i < modemList.getLength(); i++)
    {
        Node node1 = modemList.item(i);

        Node node = document.getElementsByTagName("modem").item(i);

        NamedNodeMap attr = node.getAttributes();

        Node nodeAttr = attr.getNamedItem("name");

        // if (node.getAttributes().getNamedItem("name").equals("ARM-1191"))
        if (nodeAttr.getNodeValue().equals("ARM-1191"))
        {
            NodeList paramList = node1.getChildNodes();

            for (int j = 0; j < paramList.getLength(); j++)
            {
                Node paramNode = paramList.item(j);

                switch (paramNode.getNodeName())
                {
                case "waveform":
                    paramNode.setTextContent("100");
                    break;
                case "dataRate":
                    paramNode.setTextContent("100");
                    break;
                case "interleaver":
                    paramNode.setTextContent("100");
                    break;
                default:
                    break;
                }

            }
        }

    }

    // save changes into XML file.
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();

    DOMSource source = new DOMSource(document);
    StreamResult result = new StreamResult(new File(filePath));
    transformer.transform(source, result);
    System.out.println("Done");

     }
  }

Any help will be appreciated. Thanks

Update : I am getting the following exception :

Exception in thread "main" java.lang.NullPointerException
at gerard.com.ModifyXmlFile.main(ModifyXmlFile.java:73)

at the following line :

NamedNodeMap attr = node.getAttributes();
Gerko Ford
  • 41
  • 2
  • 12
  • 2
    ...and the problem is? Any Exceptions? Did you debug your application? – f1sh May 19 '17 at 08:47
  • I have updated the question with the exception – Gerko Ford May 19 '17 at 08:56
  • Possible duplicate of [What is a NullPointerException, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – f1sh May 19 '17 at 08:57

2 Answers2

1

cryptoDevice is also a child of devices. In your for loop you will therefore run once more than there are modem nodes. This causes the null pointer.

Henry
  • 42,982
  • 7
  • 68
  • 84
0

So, node is null. I guess, that you need the node1 variable

NamedNodeMap attr = node1.getAttributes();

Norbert
  • 234
  • 1
  • 9