<script language="JavaScript">
<!--
var str1="<PName Type=\"String\" Host=\"LocalHost\"><![CDATA[测试]]></PName>";
var re = /\<(\w+) ([^\>]*?)\>(.*?)<\/\1>/if(re.test(str1))
{
var s = str1.match(re);
var t = /Type\=\"([^\"]*?)\"/
var tt;
if(t.test(s[2]))
{
var type = s[2].match(t);
tt = type[1];
alert("类型:" + type[1]);
}
else
{ alert("空类型");
} alert("<" + s[1] + " Type=\"" + tt + "\">" + s[3] + "</" + s[1] + ">");}//-->
</script>//随便写了下,你再改改吧

解决方案 »

  1.   

    如果要把<![CDATA[  ]]>之间的内容取出来呢?
    不能用DOM
      

  2.   

    <script language="JavaScript">
    <!--
    var str1="<PName Type=\"String\" Host=\"LocalHost\"><![CDATA[测试]]></PName>";
    var re = /\<(\w+) ([^\>]*?)\>(.*?)<\/\1>/var s = str1.match(re);
    if(s!=null)
    { var t = /Type\=\"([^\"]*?)\"/
    var tt;
    var type = s[2].match(t);
    if(type!=null)
    {
    tt = type[1];
    alert("类型:" + type[1]);
    }
    else
    {
    alert("空类型");
    } var content = s[3].match(/<!\[CDATA\[(.*?)\]\]>/);
    var c if(content!=null)
    {
    c = (content[1]);
    }
    else
    {
    c = s[3];
    } alert("<" + s[1] + " Type=\"" + tt + "\">" + c + "</" + s[1] + ">");}//-->
    </script>
      

  3.   

    to ttyp(愿赌服输) :咱今个儿是对上了,呵呵继续请教其实我是想写一个简单的XML分析程序,避免使用DOM这个大家伙
    节点的属性通常来说只有Type出现
    我封装了一个XMLAttribute
    节点的名称和属性名称规则是这样的:[a-z]((a-z0-9)+[\_])*[a-z]
    现在在封装XMLNode的时候有点麻烦
    你上面给的代码都可以使用,,但是扩展起来好像比较麻烦
      

  4.   

    我觉得最麻烦的就是怎么分析那些属性
    其实我是想先把所有的属性都分析出来,放到一个对象数组里面
    然后再挑出Type属性(Type属性在我的这个程序里面是“保留字”,呵呵)以后可能还有其他的保留字增加的,这样才方便
      

  5.   

    <script language="JavaScript">
    <!--
    var str1="<PName type=\"String\" Host=\"LocalHost\"><![CDATA[测试]]></PName>";
    var re = /\<(\w+) ([^\>]*?)\>(.*?)<\/\1>/var s = str1.match(re);
    if(s!=null)
    { var arrtibutes_str = /(\w+)=\"([^\"]*?)\"/g var primary_attribute_value; primary_attribute_value = ''; var arrtibutes = s[2].match(arrtibutes_str);
    if(arrtibutes!=null)
    {
    for(var i=0;i<arrtibutes.length;i++)
    {
    var arrtibute = arrtibutes[i].split('=');

    if(arrtibute[0].toLowerCase()=="type")
    {
    primary_attribute_value = arrtibute[1];
    } }
    }
    else
    {
    alert("空类型");
    } var content = s[3].match(/<!\[CDATA\[(.*?)\]\]>/);
    var c if(content!=null)
    {
    c = (content[1]);
    }
    else
    {
    c = s[3];
    } alert("<" + s[1] + " Type=\"" + primary_attribute_value + "\">" + c + "</" + s[1] + ">");}//-->
    </script>
      

  6.   

    to :  conquersky(宇森) 
    不错不错,给你20分
      

  7.   

    to  ttyp(愿赌服输) 
    辛苦了,不过你的代码在理想状况下完全正确,可下面这个就不行了var str1="<PName type=\"S>tring\" Host=\"LocalHo<st\"><![CDATA[测试]]></PName>";
    看来我得考虑放弃正则了,只能自己一个字节一个字节的分析
      

  8.   

    String.prototype.getValue = function(name)
    {
      var p = this.replace(/\s+=\s+/g, "="); if(p=="") return "";
      var reg = new RegExp("(^| )"+ name +"(=|:)(\\\"|\\\')?([^\\3]*?)(\\3)( |>|$)", "i");
      var r = p.match(reg);  if (r!=null) return r[4]; return "";
    };
    String.prototype.meizz = function()
    {
      var type = this.getValue("type");
      var PN   = this.match(/<(\w+)/);
      if(PN)
      {
        var a    = this.match(/<!\[CDATA\[(.*?)\]\]>/);
        var content = a ? a[1] : "";
        return "<"+ PN[1] +" type=\""+ type +"\">"+ content +"<\/"+ PN[1] +">";
      }
      return "";
    }
    var str1="<PName type=\"String\" Host=\"LocalHost\"><![CDATA[测试]]></PName>";
    var str2="<PName Type=\"String\"><![CDATA[测试]]></PName>";
    var str3="<PName Type=\"String\">测试</PName>";
    var str4="<PName>A</PName>";
    var str5="<PName />";
    var str6="<PName type=\"S>tring\" Host=\"LocalHo<st\"><![CDATA[测试]]></PName>";
    alert(str1 +"\r\n"+ str1.meizz());
    alert(str2 +"\r\n"+ str2.meizz());
    alert(str3 +"\r\n"+ str3.meizz());
    alert(str4 +"\r\n"+ str4.meizz());
    alert(str5 +"\r\n"+ str5.meizz());
    alert(str6 +"\r\n"+ str6.meizz());
      

  9.   

    meizz(梅花雪 封闭开发中) 一直是我的偶像
     我的正则功力还不行。。研究一下梅老大的吧。。
     顺便顶一下帖子。