c#加载xml属性

    技术2024-01-27  96

    1.5之前的J2SE版本要求您直接使用XML解析器来加载配置文件和存储设置。 尽管这从来都不是一件容易的事,并且解析器是平台的标准组成部分,但是额外的工作还是有些烦人。 现在,新更新的java.util.Properties类为加载和存储程序设置提供了一种更简便的方法: loadFromXML(InputStream is)和storeToXML(OutputStream os, String comment)方法。

    属性基础

    如果您不熟悉java.util.Properties类,可以使用它在文件中存储一组键-值对,其中键和值由等号分隔,如清单1所示。

    清单1.属性样本集
    foo=bar fu=baz

    如果清单1已加载到Properties对象中,那么您将找到两个键( foo和fu )和两个值( bar表示foo , baz表示fu )。 该类支持将\u嵌入Unicode字符串,但是重要的是,所有内容都被视为String 。

    清单2显示了如何加载属性文件并列出其当前的键和值集。 您只需将文件的InputStream传递给load()方法,然后将每个键值对添加到Properties实例。 然后,您可以使用list()列出所有属性,或者使用getProperty()检索单个属性。

    清单2.加载属性
    import java.util.*; import java.io.*; public class LoadSample { public static void main(String args[]) throws Exception { Properties prop = new Properties(); FileInputStream fis = new FileInputStream("sample.properties"); prop.load(fis); prop.list(System.out); System.out.println("\nThe foo property: " + prop.getProperty("foo")); } }

    运行LoadSample程序将产生清单3的输出。请注意, list()方法的输出不会按输入文件中的顺序生成键值对列表。 Properties类将对的集合存储在哈希表中(实际上,它是Hashtable子类),因此不保证顺序。

    清单3. LoadSample的输出
    -- listing properties -- fu=baz foo=bar The foo property: bar

    XML属性文件

    这些都不是新手。 这是Properties类始终起作用的方式。 但是,新功能是可以从XML文件加载一组属性的选项。 清单4显示了它的DTD。

    清单4. DTD属性
    <?xml version="1.0" encoding="UTF-8"?> <!-- DTD for properties --> <!ELEMENT properties ( comment?, entry* ) > <!ATTLIST properties version CDATA #FIXED "1.0"> <!ELEMENT comment (#PCDATA) > <!ELEMENT entry (#PCDATA) > <!ATTLIST entry key CDATA #REQUIRED>

    如果您不喜欢阅读XML DTD,这实际上是说包装在外部<properties>标记中的是<comment>标记,后跟任意数量的<entry>标记。 对于每个<entry>标签,都有一个key属性,条目的内容为其值。 清单5显示了清单1中的属性文件的XML版本。

    清单5.属性文件的XML版本
    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>Hi</comment> <entry key="foo">bar</entry> <entry key="fu">baz</entry> </properties>

    如清单6所示,读取Properties文件的XML版本与读取旧样式格式没有太大区别。

    清单6.读取XML属性文件
    import java.util.*; import java.io.*; public class LoadSampleXML { public static void main(String args[]) throws Exception { Properties prop = new Properties(); FileInputStream fis = new FileInputStream("sampleprops.xml"); prop.loadFromXML(fis); prop.list(System.out); System.out.println("\nThe foo property: " + prop.getProperty("foo")); } }
    关于资源包的说明

    尽管java.util.Properties类现在除了键值对之外还支持将属性文件作为XML文件支持,但是不幸的是,没有内置选项可将ResourceBundle视为XML文件。 是的, PropertyResourceBundle确实使用Properties对象来加载包; 但是,将load方法的使用硬编码到该类中,并且不使用更新的loadFromXML()方法。

    运行清单6中的程序会产生与原始程序相同的输出,如清单2所示。

    保存XML属性

    新“ Properties功能的另一面是将属性存储到XML格式的文件中。 尽管store()方法仍将创建清单1所示的文件,但是您现在可以使用新的storeToXML()方法创建清单5所示的文件。 只需传递一个OutputStream和一个String作为注释,就可以完成。 清单7演示了新的storeToXML()方法。

    清单7.将属性存储为XML文件
    import java.util.*; import java.io.*; public class StoreXML { public static void main(String args[]) throws Exception { Properties prop = new Properties(); prop.setProperty("one-two", "buckle my shoe"); prop.setProperty("three-four", "shut the door"); prop.setProperty("five-six", "pick up sticks"); prop.setProperty("seven-eight", "lay them straight"); prop.setProperty("nine-ten", "a big, fat hen"); FileOutputStream fos = new FileOutputStream("rhyme.xml"); prop.storeToXML(fos, "Rhyme"); fos.close(); } }

    清单8显示了运行清单7中的程序所产生的输出。

    清单8.存储的XML文件
    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>Rhyme</comment> <entry key="seven-eight">lay them straight</entry> <entry key="five-six">pick up sticks</entry> <entry key="nine-ten">a big, fat hen</entry> <entry key="three-four">shut the door</entry> <entry key="one-two">buckle my shoe</entry> </properties>

    结论

    使用XML文件还是使用较旧样式的a = b类型文件完全取决于您。 从内存角度来看,较旧的样式肯定是较轻的重量。 但是,对于XML的普遍性,人们希望XML格式会流行,因为它已经被广泛使用,而不仅仅是通过Properties对象。 选择完全取决于您。 检查程序包专用XMLUtils类的源,以获取有关使用的XML解析的其他信息。


    翻译自: https://www.ibm.com/developerworks/java/library/j-tiger02254/index.html

    相关资源:c#对xml多属性节点的增加,删除,修改操作源码
    Processed: 0.010, SQL: 9