【问题标题】:Easiest way to write and read an XML编写和读取 XML 的最简单方法
【发布时间】:2012-01-04 16:08:09
【问题描述】:
【问题讨论】:
标签:
android
xml
xml-parsing
android-xmlpullparser
【解决方案1】:
如果真的这么简单,你可以用 printf() 或类似的方法来写。
对于解析,最好使用真正的 XML 解析器(可能是 @netpork 建议的 SimpleXML)。但是对于真正如此微不足道的事情,您可以只使用正则表达式 - 这是我常用的集合,您主要需要 'attrlist' 和 'stag' (用于属性列表和开始标签)。
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)+\$";
XML 规范的草稿甚至包括一个“简单”的 XML 语法,它可以正确找到节点边界,但不能捕获所有错误、扩展实体引用等。请参阅 https://www.w3.org/TR/WD-xml-lang-970630#secF。
主要缺点是,如果您稍后遇到更高级的数据,它可能会损坏。例如,有人可能会向您发送数据,其中包含注释、语法错误、未引用的属性、或使用 &quo; 等。