//AddressPointer.java
public class AddressPointer implements Cloneable
{
CXMLObject m_Ptemp = null;
CXMLObject get()
{
return m_Ptemp;
}
public AddressPointer()
{
m_Ptemp = null;
}
void set( CXMLObject pToSet )
{
m_Ptemp = pToSet;
//pToSet =
}
void attach( CXMLObject pToSet )
{
m_Ptemp = pToSet;
}
public AddressPointer clone()
{
return new AddressPointer();
}
}
//MainTest.java
import javax.naming.spi.*;
class TestObj
{
}
class Test
{
//TestObj to =null;
void set( Test te )
{
//to = te;
}
void attach( Test te )
{
te = new Test();//this;
te.n = 9;
}
int n=0;
int get()
{
return n;
}
}
public class MainTest
{
Test t = new Test();
MainTest()
{
//TestObj t = null;
//System.out.println(ts.to);
//ts.set(t);
t.n = 8;
t.attach(t);
com(t);
System.out.println( t.get() );
}
void com(Test r)
{
System.out.println( r == t );
}
public static void main(String[] args)
{
//new MainTest();
try{
CXMLStructBuilder cb = new CXMLStructBuilder();
cb.prepareParseXML();
CXMLObject obj = cb.BuildTree("ConCmd.xml");
/*String strName = obj.GetNodeName();
System.out.println( obj.GetNodeName() );
System.out.println( obj.m_pThreaded_Preorder.GetNodeName() );
System.out.println( obj.m_pThreaded_Preorder.m_pThreaded_Preorder.GetNodeName() );
System.out.println( obj.m_pThreaded_Preorder.m_pThreaded_Preorder.m_pThreaded_Preorder.GetNodeName() );
System.out.println( obj.m_pThreaded_Preorder.m_pThreaded_Preorder.m_pThreaded_Preorder.m_pThreaded_Preorder.GetNodeName() );
*/
while( obj.m_pThreaded_Preorder != null )
{
System.out.println( obj.GetNodeName() );
obj = obj.m_pThreaded_Preorder;
}
CXMLObject obf = cb.FindNamedNode("cmdtype", obj);
/*do{
//Thread.sleep(200);
System.out.println( obf.FindAttribute("name"));
}while((obf = cb.FindNamedNode("cmdtype", obf)) != null);
//System.out.println( strName );*/
}catch(Exception e){
e.printStackTrace();
}
}
}
//CXMLStructBuilder.java
import java.net.URL;
import javax.xml.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.*;
import java.net.*;
import java.io.*;
public class CXMLStructBuilder
{
public CXMLStructBuilder()
{
m_pXmlTreeRoot=null;
}
protected DocumentBuilderFactory dbf=null;
protected DocumentBuilder db=null;
protected Document doc=null;
protected String fileName=null;
//对外的接口,生成必要的解析对象。
public void prepareParseXML()throws Exception
{
if(db==null)
try{
dbf = DocumentBuilderFactory.newInstance();
db = dbf.newDocumentBuilder();
}catch(Exception e){
throw e;//.printStackTrace();
}
}
private Node getXMLRoot(URL url)throws Exception
{
try
{
doc = db.parse(url.openStream());
}
catch(Exception e)
{
e.printStackTrace();
}
return (Node)doc.getDocumentElement();
}
private boolean BuildXMLObject( Node pRoot , int iLevel , CXMLObject pParant )
{
try{
if( pRoot == null )
{
return false;
}
String bstr;
if( (bstr = pRoot.getNodeName())==null )
{
return false;
}
CXMLObject pChildNode = null;
pChildNode = new CXMLObject( bstr,iLevel,pParant );
if( pChildNode == null )
{
return false;
}
pParant.AddChild( pChildNode );
BuildAttribute( pRoot, pChildNode );
NodeList pXMLChildNodeList = null;
if( (pXMLChildNodeList = pRoot.getChildNodes()) ==null )
{
return false;
}
Node pXMLChildNode = null;
int lNodeCount = 0;
lNodeCount = pXMLChildNodeList.getLength();
for( int j = 0; j < lNodeCount; ++j )
{
if( j%2 != 0 )
{
if( ( pXMLChildNode = pXMLChildNodeList.item( j )) == null )//->get_item( j, &pXMLChildNode ) ) )
{
pXMLChildNodeList = null;
return false;
}
if( !BuildXMLObject( pXMLChildNode,iLevel+1, pChildNode ) )
{
pXMLChildNode = null;
pXMLChildNodeList = null;
return false;
}
}
}
}catch(Exception e){
e.printStackTrace();
return false;
}
return true;
}
private boolean BuildAttribute( Node pNode , CXMLObject pThis )
{
try{
NamedNodeMap pXMLNodeMap = null;
if(( pXMLNodeMap = pNode.getAttributes()) == null )
{
return false;
}
if( pXMLNodeMap != null)
{
Node pXMLAttributeNode = null;
int lAttributeCount = 0;
lAttributeCount = pXMLNodeMap.getLength();
for( int i = 0; i < lAttributeCount; ++i )
{
if( (pXMLAttributeNode = pXMLNodeMap.item( i ) ) == null )
{
pXMLNodeMap = null;
return false;
}
String bstrName;
String cstrName;
if( ( bstrName = pXMLAttributeNode.getNodeName()) == null)//get_nodeName( &bstrName ) ) )
{
pXMLAttributeNode = null;
pXMLNodeMap = null;
return false;
}
cstrName = bstrName;//.Format( _T( "%S" ), bstrName );
String vstrValue;
if(( vstrValue = pXMLAttributeNode.getNodeValue()) == null)// -> get_nodeValue( &vstrValue ) ) )
{
pXMLAttributeNode = null;
pXMLNodeMap = null;
return false;
}
String cstrValue;
cstrValue = vstrValue;
pThis.AddAttribute( cstrName, cstrValue );
}
}
}catch( Exception e ){
e.printStackTrace();
return false;
}
return true;
}
public CXMLObject BuildTree( String szPath )
{
CXMLObject pRoot = null;
URL url = null;
Node root = null;
try{
File xmlFile = new File( szPath );
url = xmlFile.toURL();
root = getXMLRoot( url );
}catch(Exception e){
e.printStackTrace();
}
try{
if( m_pXmlTreeRoot != null )
DestroyTree();
String strNodeName = root.getNodeName();
m_pXmlTreeRoot = new CXMLObject( /*strNodeName*/"ROOT", 0, null );
pRoot = m_pXmlTreeRoot;
BuildXMLObject( root , 1 , m_pXmlTreeRoot );
//AddressPointer pre = new AddressPointer();
//pre.set(m_pXmlTreeRoot.m_pThreaded_Preorder);
//
int iArrayCount=m_pXmlTreeRoot.GetChildrenCount();
CXMLObject.m_Thread = m_pXmlTreeRoot;
//CXMLObject pNewBefore = m_pXmlTreeRoot.m_Thread;
for( int i = 0;i < iArrayCount; i++ )
{
/*CXMLObject pToPreGo = null;
if( i == 0 )
pToPreGo = m_pXmlTreeRoot;
else if( i >0 && i != iArrayCount-1 )
pToPreGo = m_pXmlTreeRoot.m_aChildren.elementAt( i-1 );
else if( i == iArrayCount - 1)
pToPreGo = m_pXmlTreeRoot.m_aChildren.elementAt( i );*/
if( !( m_pXmlTreeRoot.m_aChildren.elementAt( i ).Threaded_Preorder( CXMLObject.m_Thread ) ) )
{
//return false;
}
}
//
//m_pXmlTreeRoot.Threaded_Preorder( pre );
}catch(Exception e){
e.printStackTrace();
return null;
}
return pRoot;
}
public CXMLObject FindNamedNode( String szNodeName , CXMLObject pStartNode )
{
CXMLObject pRoot = pStartNode;
pRoot = pRoot.m_pThreaded_Preorder;
while ( pRoot != null )
{
if ( pRoot.GetNodeName().equals( szNodeName ) )
{
return pRoot;
}
pRoot = pRoot.m_pThreaded_Preorder;
}
return null;
}
public CXMLObject FindNamedSubNode( String szName ,CXMLObject pStartNode , CXMLObject pParant )
{
CXMLObject pRoot = pStartNode;
pRoot = pRoot.m_pThreaded_Preorder;
while ( pRoot != null )
{
if( pRoot.GetLevel() <= pParant.GetLevel() )
break;
if ( ( pRoot.GetNodeName().equals( szName )) && ( pRoot.IsPosterityOf( pParant ) ) )
{
return pRoot;
}
pRoot = pRoot.m_pThreaded_Preorder;
}
return null;
}
public CXMLObject FindNamedLevelNode( String szName , CXMLObject pStartNode ,int iLevel )
{
CXMLObject pRoot = pStartNode;
pRoot = pRoot.m_pThreaded_Preorder;
while (pRoot != null)
{
if((pRoot.GetLevel() == iLevel ) && ( pRoot.GetNodeName().equals( szName )) )
{
return pRoot;
}
pRoot = pRoot.m_pThreaded_Preorder;
}
return null;
}
public void DestroyTree()
{
if( m_pXmlTreeRoot != null )
{
m_pXmlTreeRoot = null;
}
}
private CXMLObject m_pXmlTreeRoot;//=NULL;
}
//CXMLObject.java
import java.util.*;
public class CXMLObject
{
CXMLObject( String szNmae, int iLevel , CXMLObject pParant)
{
m_szName = szNmae;
m_iLevel = iLevel;
m_pParent = pParant;
}
public String GetNodeName()
{
return m_szName;
}
public int GetLevel()
{
return m_iLevel;
}
public CXMLObject GetParent()
{
if ( m_iLevel == 0 )
{
return null;
}
return m_pParent;
}
public String GetAttributeOnIndex( int iIndex )
{
String szAttributeValue = null;
int iSize = GetAttributeCount();
for (int i = 0; i < iSize; i++ )
{
if( i == iIndex )
{
szAttributeValue = this.FindAttribute ( m_strAttr.elementAt( i ) );
if( szAttributeValue != null )
return szAttributeValue;
}
}
return null;
}
public int GetAttributeCount()
{
return m_AttrMap.size();
}
public String FindAttribute( String szAttributeName )
{
String szAttributeValue = null;
szAttributeValue = m_AttrMap.get( szAttributeName );
if( szAttributeValue != null )
return szAttributeValue;
return null;
}
public CXMLObject GetChildOnIndex( int iIndex )
{
CXMLObject pChild = null;
pChild = m_aChildren.elementAt( iIndex );
if( pChild != null )
return pChild;
return null;
}
public int GetChildrenCount()
{
return m_aChildren.size();
}
public boolean IsPosterityOf( CXMLObject pParant )
{
CXMLObject pAncestor = this.m_pParent;
do
{
if ( pAncestor == pParant )
{
return true;
}
pAncestor = pAncestor.m_pParent;
}while( pAncestor != null );
return false;
}
public boolean IsLeaf()
{
if( m_aChildren.isEmpty() )
return true;
return false;
}
//返回给定点最左边的叶子节点
/*CXMLObject GetLastNode( CXMLObject pStart )
{
int count = pStart.GetChildrenCount();
if( count == 0 )
return pStart;
CXMLObject pTemp = pStart.m_aChildren.elementAt( count - 1 );
return GetLastNode( pTemp );
}
boolean Threaded_Preorder( CXMLObject pBefore )
{
pBefore.m_pThreaded_Preorder = this;
int iArrayCount=GetChildrenCount();
for( int i = 0;i < iArrayCount; i++ )
{
CXMLObject pToPreGo = null;
if( i == 0 )
pToPreGo = this;
else if( i >0 )
pToPreGo = GetLastNode(m_aChildren.elementAt( i-1 ));
if( !( m_aChildren.elementAt( i ).Threaded_Preorder( pToPreGo ) ) )
{
return false;
}
}
return true;
}*/
static CXMLObject m_Thread ;
boolean Threaded_Preorder( CXMLObject pBefore )
{
//CXMLObject.m_Thread.m_pThreaded_Preorder = this;
//CXMLObject.m_Thread = this;
int iArrayCount=GetChildrenCount();
for( int i = 0;i < iArrayCount; i++ )
{
if( ! m_aChildren.elementAt( i ).Threaded_Preorder( CXMLObject.m_Thread ) )
{
return false;
}
}
CXMLObject.m_Thread.m_pThreaded_Preorder = this;
CXMLObject.m_Thread = this;
return true;
}
private AddressPointer m_PofPre = null;
void AddAttribute( String szAttributeName, String szAttributeValue )
{
m_AttrMap.put(szAttributeName, szAttributeValue);
m_strAttr.add( szAttributeName );
}
void AddChild( CXMLObject pChild )
{
m_aChildren.add( pChild );
}
private void DestroyChildren()
{
m_aChildren.removeAllElements();
}
CXMLObject m_pThreaded_Preorder;
private String m_szName;
private int m_iLevel;
private CXMLObject m_pParent;
Vector< CXMLObject > m_aChildren = new Vector();
private Vector< String > m_strAttr = new Vector();
private Hashtable< String, String> m_AttrMap = new Hashtable();
}