2012-06-29 30 views
6

Tôi đang cố gắng chuyển đổi XML thành JSON trong node.js bằng cách sử dụng mô-đun xml2js. Làm cách nào để xử lý bí danh không gian tên khi truy cập các biến?XML thành JSON - xử lý các không gian tên và bí danh xml trong JavaScript

Mã sau chuyển đổi tập tin của tôi (sampleWithNamespaces.xml)

var fs = require('fs'), 
xml2js = require('xml2js'); 

var parser = new xml2js.Parser(); 
fs.readFile('sampleWithNamespaces.xml', function (err, data) { 
    parser.parseString(data, function (err, result) { 
     console.dir(result); 
     console.log('Done'); 
    }); 
}); 

sampleWithNamespaces.xml:

<d:student xmlns:d='http://www.develop.com/student'> 
    <d:id>3235329</d:id> 
    <d:name>Jeff Smith</d:name> 
    <d:language>JavaScript</d:language> 
    <d:rating>9.5</d:rating> 
</d:student> 

Output:

$ node xml2jsTest.js 
{ '@': { 'xmlns:d': 'http://www.develop.com/student' }, 
    'd:id': '3235329', 
    'd:name': 'Jeff Smith', 
    'd:language': 'JavaScript', 
    'd:rating': '9.5' } 
Done 

tôi có thể truy cập vào 'tên' thuộc tính bằng cách sử dụng ký hiệu result['d:name'] thay vì result.name nếu tôi không có ký hiệu ông không gian tên bí danh. Tôi đoán câu hỏi của tôi là, tôi đang làm điều này đúng cách?

Tôi đã read rằng "Nếu phần tử có bí danh không gian tên, bí danh và phần tử được nối bằng cách sử dụng" $ ". Ví dụ: phần tử ns: trở thành phần tử ns $" Nếu tôi làm điều này tôi có thể đọc thuộc tính result.d$name. Nếu tôi đi tuyến đường này, tôi sẽ làm như thế nào?

Trả lời

0

Tài liệu bạn trích dẫn không liên quan gì đến xml2js, nhưng bạn có thể lấy cùng một mẫu nếu muốn. Bạn sẽ phải thay đổi mã nguồn của xml2js hoặc lặp qua đổi tên mọi thứ sau khi tải nó, cả hai đều không phải là ý tưởng tuyệt vời (ý nghĩa đầu tiên bạn sẽ không thể cập nhật dễ dàng như vậy, và cả bổ sung thêm tiền vào mã của bạn) , vì vậy bạn có thể chỉ cần dính vào cú pháp ['d: name']. Nhược điểm duy nhất là nó thêm 3 ký tự vào mỗi lần tra cứu, nhưng nếu máy chủ của bạn sử dụng gzip, nó sẽ không tạo ra sự khác biệt trong thế giới thực.

Nếu bạn thực sự muốn, chức năng này sẽ đổi tên tất cả mọi thứ:

function colonToDollar(obj){ 
    var r={}; 
    for(var k in obj){ 
     r[k.replace(/:/g,'$')] = (typeof obj[k]==='object') ? colonToDollar(obj[k]) : obj[k]; 
    } 
    return r; 
} 
0

nếu bạn sử dụng nút và xml2js sử dụng result["ns:entry"] để đề cập đến một mục cụ thể

2

Tôi đã có một vấn đề tương tự. Hầu hết các thẻ XML của tôi nằm trong một không gian tên duy nhất. Vì vậy, tôi quyết định loại bỏ tất cả các không gian tên khỏi XML của tôi.

Có thể loại bỏ các không gian tên trong khi phân tích cú pháp XML bằng cách thêm tagNameProcessors vào xml2js.

var parseString = require('xml2js').parseString; 
var stripNS = require('xml2js').processors.stripPrefix; 

parseString(xml_str, { tagNameProcessors: [stripNS] },function(err, result) {}); 

Điều này về mặt kỹ thuật sẽ bỏ qua tất cả không gian tên. Nếu bạn có các thẻ XML từ nhiều không gian tên, thì điều này có thể không được sử dụng nhiều.

Các vấn đề liên quan