Nếu nó thực sự đơn giản, bạn chỉ có thể viết nó bằng printf() hoặc tương tự.
Để phân tích cú pháp, bạn nên sử dụng trình phân tích cú pháp XML thực sự (có lẽ là SimpleXML mà @netpork đề xuất). Nhưng đối với một cái gì đó thực sự tầm thường này, bạn chỉ có thể sử dụng regexes - đây là tập bình thường của tôi, từ đó bạn cần chủ yếu là 'attrlist' và 'stag' (cho danh sách thuộc tính và start-tag).
xname = "([_\\w][-_:.\\w\\d]*)"; # XML NAME (imperfect charset)
xnmtoken = "([-_:.\\w\\d]+)"; #
xncname = "([_\\w][-_.\\w\\d]*)"; #
qlit = '("[^"]*"|\'[^\']*\')'; # Includes the quotes
attr = "$xname\\s*=\\s*$qlit"; # Captures name and value
attrlist = "(\\s+$attr)*"; #
startTag = "<$xname$attrlist\\s*/?>"; #
endTag = "</$xname\\s*>"; #
comment = "(<!--[^-]*(-[^-]+)*-->)"; # Includes delims
pi = "(<\?$xname.*?\?>)"; # Processing instruction
dcl = "(<!$xname\\s+[^>]+>)"; # Markup dcl (imperfect)
cdataStart = "(<!\[CDATA\[)"; # Marked section open
cdataEnd = "(]]>)"; # Marked section close
charRef = "&(#\\d+|#[xX][0-9a-fA-F]+);"; # Num char ref (no delims)
entRef = "&$xname;"; # Named entity ref
pentRef = "%$xname;"; # Parameter entity ref
xtext = "[^<&]*"; # Neglects ']]>'
xdocument = "^($startTag|$endTag|$pi|$comment|$entRef|$xtext)+\$";
Một dự thảo của spec XML thậm chí bao gồm một "tầm thường" ngữ pháp cho XML, có thể tìm thấy ranh giới nút một cách chính xác, nhưng không bắt tất cả các lỗi, mở rộng tham chiếu thực thể, vv Xem https://www.w3.org/TR/WD-xml-lang-970630#secF.
Hạn chế chính là nếu bạn chạy vào dữ liệu fancier sau này, nó có thể bị hỏng. Ví dụ: ai đó có thể gửi cho bạn dữ liệu có nhận xét trong đó hoặc lỗi cú pháp hoặc thuộc tính không được trích dẫn hoặc sử dụng &quo; hoặc bất kỳ điều gì.
Nếu bạn cần phân tích rất nhiều dữ liệu XML, bạn có thể thử [Simple XML] (http://simple.sourceforge.net/). – netpork