public class ReaderDom4j {    public static void main(String[] args) throws DocumentException, IOException 
   {
ReaderDom4j rd = new ReaderDom4j();

//读取路径为"F:\\simple.xml";的XML
String path = "";
  if("".equals(path))
  {
  path = "F:\\simple.xml";
  }
  rd.readAny(path);

}

  Document document = null;
    
  /**
   * 采用递归方式解析simple.xml并生成需要的newSimple.xml格式
   * @param childNodes
   * @param root
   * @throws IOException
   */
  public void buildXML(List childNodes,Element root) throws IOException
  {
  for(Object obj:childNodes) 
  {
  
//为newSimple.xml生成根节点
Node childNode = (Node)obj;

//定义一个计数变量来计数有多少个子节点
int nodesCount = childNode.selectNodes("*").size();

//为ROOT根节点下添加所有子节点MOC
Element rootMoc = root.addElement("MOC");

//获取Simple.xml中Moc节点下的Name属性的值并赋给变量mocName
String mocName = childNode.valueOf("@Name");

//添加newSimple.xml中每个MOC里面的属性name为mocName的值
rootMoc.addAttribute("name", mocName);

/**
 * 使用字符串拼接newSimple.xml下的MOC子节点中的displayName属性
 * 并使用变量Str接收分割组合好的字符串
 */
String str = mocName.substring(0,1)+mocName.substring(1).toLowerCase();
rootMoc.addAttribute("displayName", str+" Management");

//判断是否是最底层节点
if(nodesCount>0)
{
    //1个节点
List childNodes2 = childNode.selectNodes("*");

//使用递归 自己调自己
this.buildXML(childNodes2,rootMoc);
}

//再次获取Simple.xml中Moc节点下的Name属性的值并赋给变量name
String name = childNode.valueOf("@Name");

//接收simple.xml的action属性
String action = childNode.valueOf("@action");

//拼接字符串将newSimple.xml下的MOC节点中name的值转大写
rootMoc.addAttribute("name", name.toUpperCase());

/***
 * 拼接字符串newSimple.xml下的MOC节点中的displayName并且将拼接
 * 赋值给变量nameMoc
 */
String nameMoc = name.substring(0,1)+name.substring(1).toLowerCase();
if("Brd".equals(nameMoc))
{
nameMoc = "Board";
}
rootMoc.addAttribute("displayName", nameMoc+" Management");

//以" ,"分割action字符串用actions接收
String[] actions = action.split(",");

解决方案 »

  1.   

    1.将代码简洁化些(分多些方法)
    2.最终要达到以字符串形式输出
    例:
    public String buildXml(String sourceXml)
    {
        String outXml = "";
        //代码处理层
        return outXml;
    }
    3.dispalyName 属性暂时放弃 (因为此属性是动态生成)
      

  2.   

    //实现Web类
    unsigned int CWeb::ms_uiWSAStartupCount = 0;
    string CWeb::ms_strProxy;
    unsigned short CWeb::ms_usProxyPort = 0;CWeb::CWeb()
    {
    if(0 == ms_uiWSAStartupCount)
    {
    WSADATA wsaData;
    int iRes = WSAStartup(MAKEWORD(2,2), &wsaData);
    assert(iRes == NO_ERROR);
    }
    ms_uiWSAStartupCount++; m_sock = 0;
    m_pAddress = new struct sockaddr_in; m_pData = new char[1];
    *m_pData = 0;
    m_ulDataSize = 0; m_usHostPort = 0; m_DataAndHtmlIsSynchronous = true;
    }CWeb::~CWeb()
    {
    assert(m_pData);
    delete[] m_pData;
    m_pData = NULL;
    m_ulDataSize = 0; if(0 != m_sock)
    {
    closesocket(m_sock);
    m_sock = 0;
    } assert(m_pAddress);
    delete (struct sockaddr_in*)m_pAddress;
    m_pAddress = NULL; if(0 == ms_uiWSAStartupCount)
    {
    WSACleanup();
    }
    ms_uiWSAStartupCount--;
    }void CWeb::SetAgent(const char* pStrUserAgent)
    {
    m_strUserAgent = pStrUserAgent;
    }void CWeb::SetProxy(const char* pStrProxyName, unsigned short usProxyPort)
    {
    ms_strProxy = pStrProxyName;
    ms_usProxyPort = usProxyPort;
    }int CWeb::SetServer(const char* pStrServerName, unsigned short usServerPort)
    {
    m_strHost = pStrServerName;
    m_usHostPort = usServerPort; if(0 != m_sock)
    {
    closesocket(m_sock);
    m_sock = 0;
    }
    m_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET == m_sock) 
    {
    return WEB_ERR_CREATE_SOCK;
    } struct hostent* host = NULL;
    if(this->IsProxy())
    {
    host = gethostbyname(ms_strProxy.c_str());
    }
    else
    {
    host = gethostbyname(m_strHost.c_str());
    }
    if(NULL == host)
    {
    return WEB_ERR_GET_IP;
    } // 获取域名对应的IP
    char* lpAddr = host->h_addr;
    struct in_addr inAddr = {0};
    memmove(&inAddr,lpAddr,4); struct sockaddr_in* pAddress = (struct sockaddr_in*)m_pAddress;
    pAddress->sin_family = AF_INET;
    if(this->IsProxy())
    pAddress->sin_port = htons(ms_usProxyPort);
    else
    pAddress->sin_port = htons(m_usHostPort);
    pAddress->sin_addr.s_addr = inet_addr(inet_ntoa(inAddr)); int iRes = connect(m_sock, (SOCKADDR*)pAddress, sizeof(struct sockaddr_in));
    if (iRes == SOCKET_ERROR)
    {
    closesocket(m_sock);
    m_sock = 0;
    return WEB_ERR_CONNECT;
    }
    return WEB_ERR_NULL;
    }
      

  3.   

    void CWeb::SetRequest(
    const char* pStrVerb,
    const char* pStrObjName,
    const char* pStrAccept,
    const char* pStrReferer,
    const char* pStrAcceptEncoding,
    const char* pStrHeaders)
    {
    assert(pStrVerb);
    assert(pStrObjName); //Accept-Encoding: gzip, deflate..Host: t.sina.com.cn..Connection: Keep-Alive....
    ostringstream ossRequest;
    ossRequest << pStrVerb;
    if(this->IsProxy())
    ossRequest << " " << m_strHost.c_str() << pStrObjName;
    else
    ossRequest << " " << pStrObjName;
    ossRequest<< " " << "HTTP/1.1"; if(NULL == pStrAccept || 0 == strlen(pStrAccept))
    ossRequest << "\r\n" << "Accept: */*";
    else
    ossRequest << "\r\n" << "Accept: " << pStrAccept; if(NULL != pStrReferer && 0 == strlen(pStrReferer))
    ossRequest << "\r\n" << "Referer: " << pStrReferer; ossRequest << "\r\n" << "Accept-Language: zh-cn"; if(0 == m_strUserAgent.size())
    ossRequest << "\r\n" << "User-Agent: " << "My Agent";
    else
    ossRequest << "\r\n" << "User-Agent: " << m_strUserAgent.c_str(); if(NULL == pStrAcceptEncoding || 0 == strlen(pStrAcceptEncoding))
    ossRequest << "\r\n" << "Accept-Encoding: gzip, deflate";
    else
    ossRequest << "\r\n" << "Accept-Encoding: " << pStrAcceptEncoding; ossRequest << "\r\n" << "Host: " << m_strHost.c_str(); if(NULL != pStrHeaders && 0 == strlen(pStrHeaders))
    ossRequest << "\r\n" << pStrHeaders; if(this->IsProxy())
    ossRequest << "\r\n" << "Proxy-Connection: Keep-Alive";
    else
    ossRequest << "\r\n" << "Connection: Keep-Alive"; //添加cookie
    if(0 < m_cookieList.size())
    {
    ossRequest << "\r\n" << "Cookie:";
    for(list<CCookie>::iterator it = m_cookieList.begin(); it != m_cookieList.end(); )
    {
    ossRequest << " " << it->GetKey() << "=" << it->GetValue();
    it++;
    if(it != m_cookieList.end())
    {
    ossRequest << ";";
    }
    }
    } ossRequest << "\r\n\r\n"; m_strRequest = ossRequest.str();
    }const char* CWeb::GetRequest()
    {
    return m_strRequest.c_str();
    }int CWeb::SendRequest()
    {
    return send(m_sock, m_strRequest.c_str(), m_strRequest.size(), 0);
    }