W3C home > Mailing lists > Public > www-dom@w3.org > April to June 1999

Re: Modifying the text component of a DOM Node

From: Nigel Byrnes <byrnes@prl.research.philips.com>
Date: Wed, 07 Apr 1999 15:03:53 +0100
Message-Id: <370B65C8.6A660C2D@prl.research.philips.com>
To: David Brownell <db@argon.Eng.Sun.COM>
Cc: www-dom@w3.org, xml-feedback@java.sun.com
Hi Mike and David

Thanks for your replies. The sun DOM API doesn't allow me to do this
directly. But I managed to come up with a simple solution which does what is
required. The approach is (see setTextInNode(Node n, String newText)):

- make a clone of the text node which is to be modified
- modify the text value of the node
- replace this cloned node with the old one.

The code for this is below.

Thanks again

Nigel

======================= 8< ====================

 public void copyIntoParent(Node n) {
  // get current node's text content copy it
  // into parent node, in place of current node
  // Has the affect of removing elements from
  // text content.

  System.out.println("child " + n.getNodeName() + "  " +
getTextFromNode(n));
  setTextInNode(n, "** my new text **");
  System.out.println("child " + n.getNodeName() + "  " +
getTextFromNode(n));

 }

 public void setTextInNode(Node n, String newText) {

  Node child = n.getFirstChild(),
       clone;

  final boolean deep = false;

  // Read the text that this node has
  // and append to it the new text that is to be added
  String currentText = getTextFromNode(n);
  currentText       += newText;

  clone = child.cloneNode(deep);
  clone.setNodeValue(currentText);
  n.replaceChild(clone, child);
 }

 public String getTextFromNode(Node n) {
  // get current node's text content
  Node      child;
  String    textData = "";
  NodeList  children;
  int   numberOfChildren;

  // If the node has any child nodes,
  // bung all of them into a nodelist called children
  children  = n.getChildNodes();
  numberOfChildren = children.getLength();

  // Read each child now
  for (int i = 0; i < numberOfChildren; i++) {
   child = children.item(i);

   // If this child has some text, let's get it!
   if (child.getNodeType() == 3)
    textData += child.getNodeValue();
   // else
    // System.out.println("No text with one child of " + child.getNodeName()
+ " Type: " + child.getNodeType());
  }
  return textData;
 }





David Brownell wrote:

> > for example, ie, this xml document:
> >
> > <myDoc>this is some <emph>emphasis</emph></myDoc>
> >
> > gets transformed to:
> >
> > <myDoc>this is some emphasis</myDoc>
> >
> > The approach which I am using is:
> >
> > 1. Get the text associated with the <emph> node.
> > 2. append it to the text component of the <myDoc> node
> > 3. delete the <emph> node
>
> Simplest is to
>
>   1. Get the TEXT node child of the "emph" node.
>   2. Get the parent of that "emph" node.
>   2. Use parent.replaceChild() to replace the "emph" node with the text.
>
> > The trouble is with the setNodeValue(String) method in the Node
> > interface of Sun's API. I call it in the setTextInNode(Node n, String
> > newText) method, but the print outs I have in the copyIntoParent(Node)
> > method show that it has no affect.
>
> Right, DOM does not specify any behavior other than not throwing
> any exception in this case ... perhaps it's annoying, but that's
> how it's specified.  (The only exception that can be thrown is for
> a read-only node; since that element isn't read-only, it mustn't
> be thrown there.)
>
> - Dave



Received on Wednesday, 7 April 1999 10:07:08 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Friday, 22 June 2012 06:13:46 GMT