下面的两个函数都是根据 名称(name)返回节点的值
1是调用 IXMLNode 的方法_node->ChildValues[name];
2是调用 取出node 的所有节点然后循环对比名称(name),再返回节点的值现在的情况是相同的名称(name)调用1没有取到值,调用2能取到。
不知道是什么原因?请高手解答。谢谢_di_IXMLNode _node;
1 -----------------------------
AnsiString child_value(AnsiString name)const //返回子节点的值。
{
    if(_node == NULL)return AnsiString();
    AnsiString S;
    try
    {
        OleVariant v = _node->ChildValues[name];
        if(v.IsNull())S = AnsiString();
        else S = AnsiString(v);
    }
    catch(...){ S = AnsiString();}
    return S;
}
2 -----------------------------------------------------------------------
AnsiString  child_value_new(AnsiString name)const //返回子节点的值。
{
   if(_node == NULL)return "";
    AnsiString S;
    _di_IXMLNodeList List = _node->ChildNodes;
    for(int i=0;i<List->Count;i++)
    {
      if( List->Nodes[i]->NodeName == name  )
      {
          try
          {
              OleVariant v = List->Nodes[i]->Text;
              if(v.IsNull())S = AnsiString();
              else S = AnsiString(v);
          }
          catch(...){ S = AnsiString();}
          return S;
      }
    }
    return "";
}

解决方案 »

  1.   

    第一种方法是可以的啊,是不是你的XML文件有问题?
      

  2.   

    有的可以,有的不可以。我解析的是交易所的XBRL文件。
      

  3.   

    node->ChildNodes->Find("YourNodeName");
      

  4.   

    AnsiString  child_value_new(AnsiString name)const //返回子节点的值。
    {
       if(_node == NULL)return "";
        AnsiString S;
        _di_IXMLNodeList List = _node->ChildNodes;
              try
              {
                  OleVariant v = List->Nodes[WideString(name)]->Text;
                  if(v.IsNull())S = AnsiString();
                  else S = AnsiString(v);
              }
              catch(...){ S = AnsiString();}
              return S;
        return "";
    }
      

  5.   

    楼上的改动没作用,大家可以试一下。
    源文件如下:<?xml version="1.0" encoding="UTF-8"?>
    <xbrl xmlns="http://www.xbrl.org/2003/instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:iso4217="http://www.xbrl.org/2003/iso4217" xmlns:clcid-ar="http://www.xbrl-cn.org/cn/lcid/rpt/ar/2005-12-31" xmlns:clcid-cgi="http://www.xbrl-cn.org/cn/lcid/rpt/cgi/2005-12-31" xmlns:clcid-common="http://www.xbrl-cn.org/cn/lcid/rpt/common/2005-12-31" xmlns:clcid-ie="http://www.xbrl-cn.org/cn/lcid/rpt/ie/2005-12-31" xmlns:clcid-mr="http://www.xbrl-cn.org/cn/lcid/rpt/mr/2005-12-31" xmlns:clcid-pte="http://www.xbrl-cn.org/cn/lcid/common/pte/2005-12-31" xmlns:xbrl="http://www.xbrl.org/2003/instance" xmlns:clcid-ci-sar="http://www.xbrl-cn.org/cn/lcid/ci/ar/2006-12-31" xsi:schemaLocation="http://www.xbrl-cn.org/cn/lcid/ci/ar/2006-12-31 http://www.xbrl-cn.org/cn/lcid/ci/ar/2006-12-31/clcid-ci-ar-2006-12-31.xsd">
    <clcid-cgi:BaoGaoQiMoGuDongZongShu contextRef="C_instant_20061231" decimals="0" unitRef="U_pure">42623</clcid-cgi:BaoGaoQiMoGuDongZongShu> 
    </xbrl>
      

  6.   

    取这个节点的值  42623 ,1方法就取不出来, 2方法就能取出来<clcid-cgi:BaoGaoQiMoGuDongZongShu contextRef="C_instant_20061231" decimals="0" unitRef="U_pure">42623</clcid-cgi:BaoGaoQiMoGuDongZongShu> 
      

  7.   

    XML元素命名
    XML元素命名必须遵守下面的规则:元素的名字可以包含子母,数字和其他字符。 
    元素的名字不能以数字或者标点符号开头。 
    元素的名字不能以XML(或者xml,Xml,xMl...)开头。 
    元素的名字不能包含空格。 
    自己“发明”的XML元素还必须注意下面一些简单的规则:任何的名字都可以使用,没有保留字(除了XML),但是应该使元素的名字具有可读性,名字使用下划线是一个不错的选择。例如: <first_name>, <last_name>.尽量避免使用“-”,“.”,因为有可能引起混乱。只要你愿意元素的名字可以很长,但也不要太夸张了哦。命名应该遵循简单易读的原则,例如:<book_title>是一个不错的名字,而<the_title_of_the_book>则显得罗嗦了。 XML文档往往都对应着数据表,我们应该尽量让数据库中的字段的命名和相应的XML文档中的命名保持一致,这样可以方便数据变换。非英文/字符/字符串也可以作为XML元素的名字,例如<蓝色理想><经典论坛>这都是完全合法的名字。但是有一些软件不能很好的支持这种命名,所以尽量使用英文字母来命名。在XML元素命名中不要使用":",因为XML命名空间需要用到这个十分特殊的字符。
      

  8.   

    楼上的意思是说clcid-cgi:BaoGaoQiMoGuDongZongShu 不合法,应该不是,我的源文件比这更长的节点名都有也可以读。
      

  9.   

    clcid-cgi:BaoGaoQiMoGuDongZongShu不是说它不合法, ':'把这个名字分成两部分,一部分是clcid-cgi,叫prefix,也叫名空间. BaoGaoQiMoGuDongZongShu才是名字.你可以用Nodes[0]->Prefix 和 Nodes[0]->LocalName试验一下这种情况下用方法1 里的名字 不知道该用什么,不知道楼下有没有办法
      

  10.   

    AnsiString child_value(AnsiString name)const //返回子节点的值。
    {
        if(_node == NULL)return AnsiString();
        AnsiString S;
        try
        {
            OleVariant v = _node->ChildValues[WideString(name)];//try!!!
            if(v.IsNull())S = AnsiString();
            else S = AnsiString(v);
        }
        catch(...){ S = AnsiString();}
        return S;
    }
      

  11.   

    偶用TinyXML类可以做到:     TiXmlDocument doc(OpenDialog1->FileName.c_str());
            if(!doc.LoadFile()) return;
            TiXmlElement *root=doc.RootElement();
            TiXmlElement *node=root->FirstChildElement("clcid-cgi:BaoGaoQiMoGuDongZongShu");
            if(node)
            {
             ShowMessage(node->GetText());
            }发现TinyXML真是很爽,非常小,到网上找一下就有
      

  12.   

    借宝地试试CDATA<<![CDATA[
    <>>>。
    ]]>>
      

  13.   

    建议楼主到VC区里去问问,毕竟TXMLDocument里一般用的都是微软的IXMLDOMDocument,这方面那些家伙要利害点
      

  14.   

    MSXML应该可以的~ 我也解析过xml文件
      

  15.   

    借路问问:怎么用collision接点实现漫游时不能穿过墙壁?
    谢谢