2012-02-05 4 views
2

그래, NodeJS가 제공해야하는 여러 XML 라이브러리를 사용하려고 시도했는데 NodeJS가 웹 사이트에서 XML 파일을 읽는 방법을 알아낼 수 없습니다.NodeJS로 XML 호스트 파일 읽기

http.request, http.get 및 그 모든 것을 사용하여 파일을 가져올 수 있지만 NodeJS가 실제로 XML 파일의 데이터로 수행 할 수있는 작업은 다른 이야기입니다.

xml-stream을 사용하여 XML을 JS로 변환 할 때 뭔가 빠뜨린 것 같습니다. 웹 사이트에서 사용할 수 없습니다. 파일을 호스팅 할 때 내 코드가 실행되지만 API를 사용하고 XML 만 사용합니다.

현재 코드 : 내가 트위터를 사용하고 이해하지 못하는 것은 그러나 옵션 (cloud.tfl.gov.uk) 아무것도 출력을 사용하는 부분 ("데이터") xml.on에서 좋은 출력을 작동

var http = require('http'); 
var XmlStream = require('xml-stream'); 
var options = { host: 'cloud.tfl.gov.uk', 
     path: '/TrackerNet/LineStatus'}; 
var twitter = { host: 'api.twitter.com', 
     path: '/1/statuses/user_timeline.rss?screen_name=nwhite89'} 


var request = http.get(options).on('response', function(response) { 

    response.setEncoding('utf8'); 
    var xml = new XmlStream(response); 

    xml.on('updateElement: item', function(item) { 

    item.title = item.title.match(/^[^:]+/)[0] + ' on ' + 
     item.pubDate.replace(/ +[0-9]{4}/, ''); 
    }); 


    xml.on('text: item > pubDate', function(element) { 

    element.$text = element.$text; 

    }); 


    xml.on('data', function(data) { 
    process.stdout.write(data); 
    }); 
}); 

비록 내가 console.log ("hi")를 데이터 함수 안에 넣어도 실행되지는 않는다.

url이 연결되어있는 변수 xml 출력을 생성 한 후 console.log (xml) 또는 console.log (response)를 출력하는 것이 정확하다는 것을 알고 있습니다. 어떤 도움이라도 크게 감사 할 것입니다. 저는 지금 좋은 2 일 동안이 일에 매달 렸습니다.

답변

6

<?xml 태그 앞에 바이트 순서 표시가 있습니다.이 태그는 xml-stream이 약간 위로 올라가서 태그의 인코딩을 읽을 수 없게합니다. 즉, 직접 제공해야한다는 의미입니다.

이 대신

:

response.setEncoding('utf8'); 
var xml = new XmlStream(response, 'utf8'); 

그리고 정말, 스트림의 인코딩을 설정하는 것은 선택 사항입니다 :

response.setEncoding('utf8'); 
var xml = new XmlStream(response); 

그냥 이렇게.

var xml = new XmlStream(response, 'utf8'); 

잘 작동합니다.

여기

더 많은 정보 : 당신이 response 오히려 그 xml에서 방출 된 버퍼를 보면, 버퍼가 처음 3 바이트 UTF8의 바이트 순서 표시입니다

<Buffer ef bb bf 3c 3f 78 6d ...> 

시작 http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8

하고, 그 후에 당신은 꼬리표의 시작을 가지고 있습니다. xml-stream<?xml 태그가 파일의 시작 부분과 공백 사이에만 공백을 포함 할 것으로 예상하지만 바이트 순서 표시는 공백으로 간주하지 않습니다.

+1

실제로 이것으로 변경해 주셔서 감사합니다. var xml = new XmlStream (response, 'utf8'); 나는 그것이 아주 작다고 믿을 수 없다. 그러나 나는 그것이 있어야 할 것이다라는 것을 알고 있었다! –