如何在XML文件中存储点列表及双精度数值列表?
嘿,刚接触XML的话,这两个问题确实是新手常会碰到的,我来给你分享几个实用的解决方案~
一、存储点列表的常见方式
XML的灵活性很强,存储点列表主要看你对可读性和紧凑性的需求,这里有两种主流方案:
方式1:结构化子元素(可读性优先)
这种方式最直观,每个点用独立的<point>元素包裹,内部再拆分<x>和<y>子元素,非常适合人类阅读和后续的解析维护:
<state> <name>Name state 2</name> <x>x</x> <y>y</y> <width>w</width> <height>h</height> <nlinks>2</nlinks> <effect>1</effect> <!-- 点列表部分 --> <points> <point> <x>123.45</x> <y>67.89</y> </point> <point> <x>456.78</x> <y>90.12</y> </point> </points> </state>
方式2:紧凑分隔文本(节省空间优先)
如果想让XML文件体积更小,可以把每个点的坐标用分隔符(比如逗号、分号)拼接成字符串,放在单个元素里;也可以用属性存储:
<state> <name>Name state 2</name> <x>x</x> <y>y</y> <width>w</width> <height>h</height> <nlinks>2</nlinks> <effect>1</effect> <!-- 用分号分隔点,逗号分隔坐标 --> <points>123.45,67.89;456.78,90.12</points> <!-- 或者用属性批量存储 --> <!-- <points point1="123.45,67.89" point2="456.78,90.12" /> --> </state>
这种方式需要你在解析时自己拆分字符串,适合对文件大小有明确要求的场景。
二、高效存储双精度(double)数值列表的方案
这里的“高效”分两种:解析效率和存储体积效率,可以根据你的需求选择:
方式1:结构化子元素(解析友好)
和点列表的结构化思路一致,每个double值用独立的<value>元素包裹,解析时直接读取文本转成double即可,几乎不用额外处理:
<state> <name>Name state 2</name> <x>x</x> <y>y</y> <width>w</width> <height>h</height> <nlinks>2</nlinks> <effect>1</effect> <!-- double数值列表 --> <doubleValues> <value>3.141592653589793</value> <value>2.718281828459045</value> <value>1.4142135623730951</value> </doubleValues> </state>
方式2:分隔符紧凑存储(体积高效)
如果想减少XML的标签开销,把所有double值用空格、逗号或分号分隔,放在单个元素里,能大幅压缩文件体积:
<state> <name>Name state 2</name> <x>x</x> <y>y</y> <width>w</width> <height>h</height> <nlinks>2</nlinks> <effect>1</effect> <!-- 用空格分隔的double列表 --> <doubleValues>3.141592653589793 2.718281828459045 1.4142135623730951</doubleValues> </state>
注意:如果你的数值会用逗号作为小数分隔符(比如部分欧洲地区的格式),建议换用分号或其他自定义分隔符,避免解析时出现歧义。
极端场景优化:CDATA包裹
如果你的double列表特别长,且担心数值里的特殊字符干扰XML解析,可以用CDATA块包裹内容:
<state> <name>Name state 2</name> <x>x</x> <y>y</y> <width>w</width> <height>h</height> <nlinks>2</nlinks> <effect>1</effect> <doubleValues><![CDATA[3.141592653589793,2.718281828459045,1.4142135623730951]]></doubleValues> </state>
内容的提问来源于stack exchange,提问作者Juliette Marquis
相关产品推荐
相关产品推荐

