2009-01-29 32 views
9

Trong dự án của tôi có những tình huống mà chúng tôi phải gửi các tin nhắn xml (như char *) giữa các mô-đun. Họ không phải là những người thực sự lớn, chỉ 10-15 dòng. Ngay bây giờ mọi người chỉ cần tự tạo chuỗi. Tôi không nghĩ rằng đây là cách tiếp cận đúng. Chúng tôi đã sử dụng thư viện DOM xerces. Vì vậy, tại sao không tạo ra một cây Dom, serialize nó, và sau đó gửi nó.Tạo XML trong Mã C++

Các bạn gợi ý điều gì?

Trả lời

6

Nếu bạn thực sự chỉ tạo các tin nhắn XML nhỏ, Xerces là một quá mức, IMHO. Nó là một thư viện phân tích cú pháp và bạn không phân tích cú pháp gì cả.

+2

tôi phản đối kịch liệt. Việc tạo XML bằng tay khá dễ xảy ra lỗi (các vấn đề mã hóa, thoát khỏi các ký tự) vì vậy tôi khuyên bạn nên tạo một cây (DOM hoặc cái gì đó khác) và sau đó để tuần tự hóa nó. – bortzmeyer

+1

Này, tôi chỉ nói "Xerces là một quá mức cần thiết". Thoát có thể (và nên) được xử lý bởi một hàm duy nhất hoặc một thư viện nhẹ như Genx: http://www.tbray.org/ongoing/genx/docs/Guide.html - Nemanja Trifunovic –

1

số liệu

so sánh phải mất bao lâu bạn phải tự tạo ra chuỗi chục lần hoặc lâu hơn, sau đó so sánh phải mất bao lâu với thư viện.

Nếu các thành viên trong nhóm của bạn giống như tôi, họ sẽ nhanh chóng thay đổi giai điệu của họ.

cộng với, yếu tố trong thời gian QA nếu chúng mã sai, ...

sử dụng thư viện nhiều nhất có thể.

2

Tôi khuyên bạn nên tạo cây DOM. Bạn sẽ không phải lo lắng về việc thoát khỏi các ký tự XML trong dữ liệu của mình. Nếu một nhà phát triển quên một lần, bạn có thể có dữ liệu nhập của người dùng làm cho đầu ra XML của bạn không chính xác.

0

Tôi sẽ chỉ sử dụng cây DOM. Bằng cách đó bạn không phải phân tích cú pháp dữ liệu qua lại khi gửi và nhận chuỗi xml.

--- Hơi off topic: Đối với những người khác chỉ bỏ qua đường bưu điện này và một cách tình cờ cần một khuôn khổ xml DOM siêu nhẹ sử dụng này một: http://www.applied-mathematics.net/tools/xmlParser.html

Nó rất dễ sử dụng, và bao gồm 2 các tập tin.

1

Tôi đã gặp vấn đề tương tự với việc muốn truyền thông điệp xml giữa các thiết bị được nhúng.

Tôi đã viết đoạn mã sau (tất cả trong một tệp tiêu đề) là một api nhanh để phân tích cú pháp và tạo xml. Nó không hỗ trợ tất cả các tính năng xml, nhưng thông điệp xml đơn giản nhất không cần chúng anyway:

http://www.scottlangham.co.uk/2009/01/rapidxml-a-quick-xml-parsergenerator-for-c/

Có ví dụ sử dụng thể hiện trong các ý kiến.

Để viết xml bạn có thể làm một cái gì đó như sau:

int isbn = 2938237; 
wstring authorName = "Isaac Asimov"; 
wstring borrower = "Mr. Blobby"; 

CWTag bookTag = libraryTag(L"Book") 
    (L"author",authorName) (L"isbn",isbn) (L"borrower",borrower); 
bookTag(L"Review") (L"comments", L"very good"); 

và kết quả này trong xml mới được thêm vào dưới thẻ:

<Book author="Isaac Asimov" isbn="2938237" borrower="Mr. Blobby"> 
    <Review comments="very good"/> 
</Book> 

Chúng tôi đã cố gắng thư viện khác, tôi có thể Không nhớ cái nào, và thấy nó không đủ nhanh. Chúng tôi không muốn gắn bó với các chuỗi định dạng theo cách thủ công vì chúng tôi đã xử lý khá nhiều thư.

3

Bạn có thể sử dụng DOM hoặc viết cho mình khung công tác tạo XML C++ nhỏ.

Các Xerces API đã được chuyển từ Java và bằng cách sử dụng phạm vi đối tượng bạn có thể làm cho việc tạo ra XML từ C++ dễ dàng hơn:

XmlWriter w; 
Elem book = w.Element("book"); 
book.addAttrib("title", "Lord of the Rings"); 
Elem author = e.addChild("author"); 
author.addAttrib("age", 43); 
author.addText("Tolkien"); 

này sẽ cho kết quả trong XML sau:

<book title="Lord of the Rings"> 
    <author age="43">Tolkien</author> 
</book> 
0

Nếu bạn đang tạo một tệp XML trung bình đến lớn, bạn sẽ cần một thư viện để hỗ trợ bạn. Nếu bạn đang tạo một tệp XML nhỏ đến rất nhỏ, bạn cũng có thể truyền luồng văn bản vào đó.

astream << "<book title=\"Lord of the Rings\"><author age=\"43\">Tolkien</author></book>" 

là về dễ dàng như bạn có thể nhận được cho rằng mảnh kích thước XML, nếu các tập tin XML của bạn là kích thước đó, bạn cũng có thể chỉ xây dựng chúng theo cách này - không cố gắng overcomplicate vấn đề chỉ dành riêng cho một số purist lý tưởng mà không thực sự giúp bạn.

Giống như tối ưu hóa, bạn không bao giờ nên thay đổi mọi thứ mà không đo lường hiệu quả của nó. Ở đây, nếu mã của bạn có thể duy trì được, hãy tiếp tục với nó. Chỉ cố gắng thay đổi nó khi bạn đã đo được khả năng bảo trì của nó (tức là nhận thấy sự lúng túng của nó để cập nhật các XML) và nhận thấy rằng quá trình này mất quá nhiều thời gian cho sự thoải mái.

+0

miễn là người lập trình biết cách để xử lý các ký tự như '<' and '>' và '&' trong phần tử xml - và cả unicode. – jdkoftinoff

2

Tạo XML bằng tay là một trong những cách chắc chắn nhất để chứng điên cuồng mà tôi biết. Cuối cùng, một người nào đó sẽ làm hỏng một thực thể ở đâu đó, hoặc một dấu ngoặc đơn sẽ bị bỏ đi, hoặc một cái gì đó ... chỉ cần sử dụng một thư viện. GenX sẽ là lựa chọn của tôi.

Chỉnh sửa: Đọc sai bài đăng của bạn. Nếu bạn đã có thư viện thế hệ, hãy sử dụng thư viện đó. Đừng làm phức tạp những thứ không cần thiết nếu bạn có thể tránh nó.

0

Tôi thực sự sử dụng CMarkup từ FirstObject.com.

CodeProject có một phân phối và văn bản hướng dẫn cũ (http://www.codeproject.com/KB/cpp/markupclass.aspx)

Source code phân phối có sẵn và các thành phần đi kèm trong nhiều hương vị (nhà phát triển, nâng cao phát triển) qua trang FirstObject tải (s).

Trang web FirstObject chứa nhiều ví dụ hữu ích và thậm chí họ còn phân phối Trình chỉnh sửa XML miễn phí.

Không, tôi không phải là nhân viên nhưng tôi là chủ sở hữu hài lòng của thành phần.

3

nhanh và dễ dàng, hãy thử TinyXml API:
http://www.grinninglizard.com/tinyxml/

+0

Để chứng thực chất lượng của nó, hãy xem ai hiện diện trong SDK từ Adobe. tìm trong \ sdk91_v1_win \ Adobe \ Acrobat 9 SDK \ Phiên bản 1 \ NonAdobeSupport \ TinyXML (http://download.macromedia.com/pub/developer/acrobat/sdk/9/sdk91_v1_win.zip) – lsalamon