简体   繁体   中英

Xml parsing for in between xml data with tags in java

Xml parsing for inbetween xml data

I have a XML string in one my java String objects as below:

<Record>
    <op>Add</op>
    <sensdata>400188711111</sensdata>
    <id>4</id>
    <a1>1111201090467034</a1>
</Record>

If i need the data between

<Record> </Record>

ie

<op>Add</op>
<sensdata>4001887XXXXX</sensdata>
<id>4</id>
<a1>1111201090467034</a1>

Can I get using the xml parser. I am able to get the values like Add40018871111141111201090467034. But not with tags.

Below is my code snippet

ByteArrayInputStream stream = new ByteArrayInputStream("<Record><op>Add</op><sensdata>400188711111</sensdata><id>4</id><a1>1111201090467034</a1></Record>".getBytes());
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(stream);
NodeList sensdata = document.getDocumentElement().getElementsByTagName("sensdata");
String sensitiveData = sensdata.item(0).getTextContent();

Editing my question with the Solution i have tried:

I did as below:

ByteArrayInputStream stream = new ByteArrayInputStream(toBeParsed.getBytes());
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(stream);      
NodeList XmlTagNodeList = document.getDocumentElement().getElementsByTagName(XmlTag);
Document newXmlDocument = DocumentBuilderFactory.newInstance()
        .newDocumentBuilder().newDocument();
for (int i = 0; i < XmlTagNodeList.getLength(); i++) {
    Node node = XmlTagNodeList.item(i);
    Node copyNode = newXmlDocument.importNode(node, true);
    newXmlDocument.appendChild(copyNode);
}

DOMImplementationLS domImplementationLS = (DOMImplementationLS) newXmlDocument.getImplementation();
LSSerializer lsSerializer = domImplementationLS.createLSSerializer();
record = lsSerializer.writeToString(newXmlDocument);
System.out.println(record);

It prints record prepended with xml tag for every record.

Kindly let me know, is it a good way to do it? And I do not require xml tag. How to get rid of this?

If you are trying to output the XML literally, with the tags and stuff, you can do it by using the Transformer API available at javax.xml.transform.*

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); // I prefer to have the <?xml ?> tag
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // Indent the code
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); // Original encoding
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); // Indent 4 spaces

// write the XML of a single node to an OutputStream
transformer.transform(new DOMSource(node),  new StreamResult(new OutputStreamWriter(out, "UTF-8")));

Is this what you need?

Edit (looping through the nodes):

// Your previous code
LSSerializer lsSerializer = domImplementationLS.createLSSerializer();
StringBuilder builder = new StringBuilder();
NodeList children = newXmlDocument.getChildNodes();
for(int x = 0; x < children.getLength(); x++)
{
    Node node = children.item(x);
    builder.append(lsSerializer.writeToString(node));
    builder.append("\n");
}
System.out.println(builder.toString());

Is that any help?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM