谢谢各位高手帮忙。
这两天需要解决一个,从其他网站的xml中提取元素信息的工作的问题,但试了很多种方法都有问题,google了很久,但越查疑问越多,所以这里把思路和疑问,都写出来,希望各位能帮忙解决下。目标xml:其他网站上的,非本地
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/layout/character-sheet.xsl"?><page globalSearch="1" lang="en_us" requestUrl="/character-sheet.xml">
  <characterInfo>
 .......
  </characterInfo>具体任务目标:得到xml中具体的元素的值,用来填充自己的网站方法一:xml解析函数(关键代码)
       Sring s = "这里是目标网页网址";
         DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
         doc = docBuilder.parse (new File(s));
                t.printStackTrace ();
错误:url 错误,只能取到本地地址,无法使用完整的网页地址。(也许取的到,但我没成功,而且不知道FILE能不能直接这么取)方法二:数据流读入
         URL url = new URL("目标地址");
URLConnection uc = url.openConnection();
        HttpURLConnection connection = (HttpURLConnection) uc;
connection.setDoOutput(true);
connection.setDoInput(true);
InputStream in = connection.getInputStream();
String str = "";
byte[] b = new byte[2];
        //读出输入流到string中
int i = in.read(b);
while (-1 != i) {
str = str + new String(b, 0, b.length);
i = in.read(b);
            }
sb = new StringBuffer(str);
StringReader sr = new StringReader(sb.toString());

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docuBuilder = factory.newDocumentBuilder();
InputSource source = new InputSource(sr);
Document document = docuBuilder.parse(source);
in.close();问题:读取xml没有问题,但读取具有<?xml-stylesheet type="text/xsl" href="/layout/character-sheet.xsl"?>,读出来的就是被浏览器编译过的html文件了,提取数据非常麻烦。方法三:使用js
    function getData(){
     var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
     xmlDoc.async="false";
     xmlDoc.load("http://www.wowarmory.com/character-sheet.xml?r=Spirestone&n=Vilden");
  }
问题:在IE上可以使用这种方法,也得到了想要的数据,但是在将得到的资源(比如图片)放到自己的网页的时候,火狐就会禁止我这么做,造成别人无法访问我的网页方法四:在坚持使用jsp的情况下,使用asp去读xmlasp提供有xml的解析程序,我准备把读到的程序写到一个服务器页面上去,然后再用jsp的方法读取,但是似乎效率很低。希望,各位大侠能够帮我看看,哪种方法更好,或者有更好的方法      

解决方案 »

  1.   

    如果其他网站的 xml 有问题的话,不管什么都会出问题,建议是 java
      

  2.   

    ajax可以返回xml格式的数据,所以用ajax试试看。
      

  3.   

    查了一下文档,DocumentBuilder提供一个方法parse(String uri) ,将给定 URI 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。改成这样:
    doc = docBuilder.parse ("xml文档所在的uri地址"); 
              
      

  4.   

    谢谢 zou,我看文档漏了这个方法,doc = docBuilder.parse ("xml文档所在的uri地址"); ,有点绕弯子了但是,虽然方法一,取到了正确的url,但是用doc = docBuilder.parse ("xml文档所在的uri地址")方法解析xml,受到了这句话的干扰:<?xml-stylesheet type="text/xsl" href="/layout/character-sheet.xsl"?>,于是就无法解析;奇怪的是用js解析(方法三),就可以忽略这句话,正确解析了;我以往的思路是把xml读到输入流中,让后用字符串或字符数组把这句话裁掉,然后用docBuilder.parse ("xml文档所在的uri地址")解析xml,可问题是我一连接,读数据,读出来的就是被浏览器编译好的html,而不是源代码的xml,使得获取其中数据更难了(貌似可以用正则表达式)。看到asp也有不受那句话影响的读取xml的方法,就想找下有没有更好的Java方法。路过的高手,帮下小弟吧,新手艰难,老板催的急,感觉就在催命啊
      

  5.   

    最近使用过Tidy.jar这个包提取过html内容,不知道跟楼主的问题是不是一样
      

  6.   

    使用你的 方法二:数据流读入 ,读出来的就是被浏览器编译过的html文件了,
    得到html后使用正则表达式去读去页面上你想要的数据就OK了 。
    或者直接使用它的html,再down下它的css js 就OK了(很流氓,大家不要骂我)
      

  7.   

    本地做 xml的代理,用URLConnection读取,然后
    1 直接返回要用的数据
    2 直接返回读取到的内容然后页面直接用Ajax调用就行了,这样可以解决跨域访问的问题。
      

  8.   

    问题解决,用的是9楼的方法,谢谢各位了,给分回复10楼,不是很明白你说的,我用URLConnection读取到inputstream中的数据就是一个编译好的html代码了,并不是我当初想要的xml文件(虽然目标文件是
    http://**/character-sheet.xml,但因为有一句<?xml-stylesheet type="text/xsl" href="/layout/character-sheet.xsl"?> <page globalSearch="1" lang="en_us" requestUrl="/character-sheet.xml"> 就是会出错;我将xml文件手动下到本地后,删除这句话后,把它放到自己服务器上后,就可以读取到xml了.很奇怪
    )