Heim > Java > javaLernprogramm > Hauptteil

So konfigurieren Sie die Java-Persistenz-XML-Datei

WBOY
Freigeben: 2023-05-04 09:40:06
nach vorne
925 Leute haben es durchsucht
<h4>Wählen Sie ein Format</h4> <p>Das Schreiben einer Konfigurationsdatei ist eine ziemlich komplizierte Angelegenheit. Ich habe versucht, Konfigurationselemente in einer durch Kommas getrennten Textdatei zu speichern, und ich habe versucht, Konfigurationselemente in sehr ausführlichem YAML und XML zu speichern. Bei Konfigurationsdateien kommt es vor allem auf Konsistenz und Regelmäßigkeit an. Sie ermöglichen es Ihnen, einfach und schnell Code zu schreiben und gleichzeitig Daten aus der Konfigurationsdatei zu analysieren sie und aktualisieren Sie die Konfiguration. </p> <p>Derzeit gibt es mehrere gängige Konfigurationsdateiformate. Für die gängigsten Konfigurationsdateiformate verfügt Java über entsprechende Bibliotheken. In diesem Artikel verwende ich das XML-Format. Für einige Projekte können Sie sich für die Verwendung von XML entscheiden, da eine seiner herausragenden Eigenschaften die Fähigkeit ist, eine Fülle relevanter Metadaten für die darin enthaltenen Daten bereitzustellen, während Sie sich für andere Projekte aufgrund seiner Ausführlichkeit möglicherweise nicht für XML entscheiden. Das Arbeiten mit XML in Java ist sehr einfach, da es standardmäßig viele robuste XML-Bibliotheken enthält. </p> <h4>XML-Grundlagen</h4> <p>Die Diskussion über XML ist ein großes Thema. Ich habe ein Buch über XML, das über 700 Seiten lang ist. Glücklicherweise erfordert die Arbeit mit XML keine detaillierte Kenntnis seiner vielen Funktionen. Genau wie HTML ist XML eine mehrschichtige Auszeichnungssprache mit öffnenden und schließenden Tags, die jeweils null oder mehr Daten enthalten können. Hier ist ein einfacher Beispielausschnitt von XML: </p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:xml;"><xml> <node> <element>Penguin</element> </node> </xml></pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>In diesem selbstbeschreibenden Beispiel verwendet der XML-Parser die folgenden Konzepte: </p><ul class=" list-paddingleft-2"><li><p>Dokument Dokument: <code><xml></code Das >-Tag markiert den Anfang eines Dokuments und das Tag <code></xml></code> markiert das Ende des Dokuments. <code><xml></code> 标签标志着一个 文档 的开始,<code></xml></code> 标签标志着这个文档的结束。</p></li><li><p>节点Node:<code><node></code> 标签代表了一个 节点。</p></li><li><p>元素Element:<code><element>Penguin</element></code> 中,从开头的 <code><</code> 到最后的 <code>></code> 表示了一个 元素。</p></li><li><p>内容Content: 在 <code><element></code> 元素里,字符串 <code>Penguin</code> 就是 内容。</p></li></ul><p>不管你信不信,只要了解了以上几个概念,你就可以开始编写、解析 XML 文件了。</p><h4>创建一个示例配置文件</h4><p>要学习如何解析 XML 文件,只需要一个极简的示例文件就够了。假设现在有一个配置文件,里面保存的是关于一个图形界面窗口的属性:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:xml;"><xml> <window> <theme>Dark</theme> <fullscreen>0</fullscreen> <icons>Tango</icons> </window> </xml></pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>创建一个名为 <code>~/.config/DemoXMLParser</code> 的目录:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:bash;">$ mkdir ~/.config/DemoXMLParser</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>在 Linux 中,<code>~/.config</code> 目录是存放配置文件的默认位置,这是在 自由桌面工作组 的规范中定义的。如果你正在使用一个不遵守 自由桌面工作组Freedesktop标准的操作系统,你也仍然可以使用这个目录,只不过你需要自己创建这些目录了。</p><p>复制 XML 的示例配置文件,粘贴并保存为 <code>~/.config/DemoXMLParser/myconfig.xml</code> 文件。</p><h4>使用 Java 解析 XML</h4><p>如果你是 Java 的初学者,你可以先阅读我写的 面向 Java 入门开发者的 7 个小技巧。一旦你对 Java 比较熟悉了,打开你最喜爱的集成开发工具(IDE),创建一个新工程。我会把我的新工程命名为 <code>myConfigParser</code>。</p><p>刚开始先不要太关注依赖导入和异常捕获这些,你可以先尝试用 <code>javax</code> 和 <code>java.io</code> 包里的标准 Java 扩展来实例化一个解析器。如果你使用了 IDE,它会提示你导入合适的依赖。如果没有,你也可以在文章稍后的部分找到完整的代码,里面就有完整的依赖列表。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">Path configPath = Paths.get(System.getProperty("user.home"), ".config", "DemoXMLParser"); File configFile = new File(configPath.toString(), "myconfig.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; builder = factory.newDocumentBuilder(); Document doc = null; doc = builder.parse(configFile); doc.getDocumentElement().normalize();</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>这段示例代码使用了 <code>java.nio.Paths</code> 类来找到用户的主目录,然后在拼接上默认配置文件的路径。接着,它用 <code>java.io.File</code> 类来把配置文件定义为一个 <code>File</code> 对象。</p><p>紧接着,它使用了 <code>javax.xml.parsers.DocumentBuilder</code> 和 <code>javax.xml.parsers.DocumentBuilderFactory</code> 这两个类来创建一个内部的文档构造器,这样 Java 程序就可以导入并解析 XML 数据了。</p><p>最后,Java 创建一个叫 <code>doc</code> 的文档对象,并且把 <code>configFile</code> 文件加载到这个对象里。通过使用 <code>org.w3c.dom</code></li></p><p>Node: <code><node></code> label stellt einen Knoten dar. </p></li>🎜🎜Element: <code><element>Penguin</element></code>, vom Anfang <code><</code> bis zum letzten <code>></ code> stellt ein Element dar. 🎜</li>🎜🎜Inhalt: Im Element <code><element></code> ist die Zeichenfolge <code>Penguin</code> der Inhalt. 🎜</li></ul>🎜Ob Sie es glauben oder nicht, solange Sie die oben genannten Konzepte verstehen, können Sie mit dem Schreiben und Parsen von XML-Dateien beginnen. 🎜🎜Erstellen Sie eine Beispielkonfigurationsdatei🎜🎜Um zu lernen, wie man XML-Dateien analysiert, benötigen Sie lediglich eine minimalistische Beispieldatei. Angenommen, es gibt eine Konfigurationsdatei, die die Eigenschaften eines grafischen Schnittstellenfensters speichert: 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">NodeList nodes = doc.getElementsByTagName("window"); for (int i = 0; i < nodes.getLength(); i++) { Node mynode = nodes.item(i); System.out.println("Property = " + mynode.getNodeName()); if (mynode.getNodeType() == Node.ELEMENT_NODE) { Element myelement = (Element) mynode; System.out.println("Theme = " + myelement.getElementsByTagName("theme").item(0).getTextContent()); System.out.println("Fullscreen = " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent()); System.out.println("Icon set = " + myelement.getElementsByTagName("icons").item(0).getTextContent()); } }</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜Erstellen Sie ein Verzeichnis mit dem Namen <code>~/.config/DemoXMLParser</code>: 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">$ java ./DemoXMLParser.java Property = window Theme = Dark Fullscreen = 0 Icon set = Tango</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜In Linux, < Der Code>~/. Das Verzeichnis config</code> ist der Standardspeicherort für Konfigurationsdateien, wie in den Spezifikationen der Free Desktop Working Group definiert. Wenn Sie ein Betriebssystem verwenden, das nicht den Freedesktop-Standards entspricht, können Sie dieses Verzeichnis weiterhin verwenden, müssen diese Verzeichnisse jedoch selbst erstellen. 🎜🎜Kopieren Sie die XML-Beispielkonfigurationsdatei, fügen Sie sie ein und speichern Sie sie als Datei <code>~/.config/DemoXMLParser/myconfig.xml</code>. 🎜🎜Verwenden Sie Java zum Parsen von XML🎜🎜Wenn Sie ein Java-Anfänger sind, können Sie zunächst meine 7 Tipps für Java-Entwickler-Anfänger lesen. Wenn Sie mit Java besser vertraut sind, öffnen Sie Ihr bevorzugtes integriertes Entwicklungstool (IDE) und erstellen Sie ein neues Projekt. Ich werde mein neues Projekt <code>myConfigParser</code> nennen. 🎜🎜Achten Sie zu Beginn nicht zu sehr auf Abhängigkeitsimporte und das Abfangen von Ausnahmen. Sie können zunächst versuchen, die Standard-Java-Erweiterungen in <code>javax</code> und <code>java.io</code> zu verwenden Pakete zum Instanziieren eines Parsergeräts. Wenn Sie eine IDE verwenden, werden Sie aufgefordert, die entsprechenden Abhängigkeiten zu importieren. Wenn nicht, finden Sie den vollständigen Code später im Artikel, der eine vollständige Liste der Abhängigkeiten enthält. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">package myConfigParser; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class ConfigParser { public static void main(String[] args) { Path configPath = Paths.get(System.getProperty("user.home"), ".config", "DemoXMLParser"); File configFile = new File(configPath.toString(), "myconfig.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } Document doc = null; try { doc = builder.parse(configFile); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } doc.getDocumentElement().normalize(); NodeList nodes = doc.getElementsByTagName("window"); for (int i = 0; i < nodes.getLength(); i++) { Node mynode = nodes.item(i); System.out.println("Property = " + mynode.getNodeName()); if (mynode.getNodeType() == Node.ELEMENT_NODE) { Element myelement = (Element) mynode; System.out.println("Theme = " + myelement.getElementsByTagName("theme").item(0).getTextContent()); System.out.println("Fullscreen = " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent()); System.out.println("Icon set = " + myelement.getElementsByTagName("icons").item(0).getTextContent()); } // close if } // close for } // close method } //close class</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜Dieser Beispielcode verwendet die Klasse <code>java.nio.Paths</code>, um das Home-Verzeichnis des Benutzers zu finden, und fügt dann den Pfad zur Standardkonfigurationsdatei zusammen. Als nächstes wird die Klasse <code>java.io.File</code> verwendet, um die Konfigurationsdatei als <code>File</code>-Objekt zu definieren. 🎜🎜Als nächstes werden die beiden Klassen <code>javax.xml.parsers.DocumentBuilder</code> und <code>javax.xml.parsers.DocumentBuilderFactory</code> verwendet, um einen internen Dokumentkonstruktor zu erstellen. Dies ermöglicht Java-Programmen XML-Daten importieren und analysieren. 🎜🎜Schließlich erstellt Java ein Dokumentobjekt namens <code>doc</code> und lädt die Datei <code>configFile</code> in dieses Objekt. Es liest und normalisiert XML-Daten mithilfe des Pakets <code>org.w3c.dom</code>. 🎜🎜Das ist im Grunde alles. Theoretisch haben Sie die Datenanalysearbeit abgeschlossen. Das Parsen von Daten nützt jedoch wenig, wenn Sie keinen Zugriff auf die Daten haben. Schreiben wir also weitere Abfragen, um wichtige Eigenschaftswerte aus Ihrer Konfiguration zu lesen. 🎜<h4>使用 Java 访问 XML 的值</h4><p>从你已经读取的 XML 文档中获取数据,其实就是要先找到一个特定的节点,然后遍历它包含的所有元素。通常我们会使用多个循环语句来遍历节点中的元素,但是为了保持代码可读性,我会尽可能少地使用循环语句:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">NodeList nodes = doc.getElementsByTagName("window"); for (int i = 0; i < nodes.getLength(); i++) { Node mynode = nodes.item(i); System.out.println("Property = " + mynode.getNodeName()); if (mynode.getNodeType() == Node.ELEMENT_NODE) { Element myelement = (Element) mynode; System.out.println("Theme = " + myelement.getElementsByTagName("theme").item(0).getTextContent()); System.out.println("Fullscreen = " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent()); System.out.println("Icon set = " + myelement.getElementsByTagName("icons").item(0).getTextContent()); } }</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p>这段示例代码使用了 <code>org.w3c.dom.NodeList</code> 类,创建了一个名为 <code>nodes</code> 的 <code>NodeList</code> 对象。这个对象包含了所有名字匹配字符串 <code>window</code> 的子节点,实际上这样的节点只有一个,因为本文的示例配置文件中只配置了一个。</p><p>紧接着,它使用了一个 <code>for</code> 循环来遍历 <code>nodes</code> 列表。具体过程是:根据节点出现的顺序逐个取出,然后交给一个 <code>if-then</code> 子句处理。这个 <code>if-then</code> 子句创建了一个名为 <code>myelement</code> 的 <code>Element</code> 对象,其中包含了当前节点下的所有元素。你可以使用例如 <code>getChildNodes</code> 和 <code>getElementById</code> 方法来查询这些元素,项目中还 记录了 其他查询方法。</p><p>在这个示例中,每个元素就是配置的键。而配置的值储存在元素的内容中,你可以使用 <code>.getTextContent</code> 方法来提取出配置的值。</p><p>在你的 IDE 中运行代码(或者运行编译后的二进制文件):</p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">$ java ./DemoXMLParser.java Property = window Theme = Dark Fullscreen = 0 Icon set = Tango</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p>下面是完整的代码示例:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">package myConfigParser; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class ConfigParser { public static void main(String[] args) { Path configPath = Paths.get(System.getProperty("user.home"), ".config", "DemoXMLParser"); File configFile = new File(configPath.toString(), "myconfig.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } Document doc = null; try { doc = builder.parse(configFile); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } doc.getDocumentElement().normalize(); NodeList nodes = doc.getElementsByTagName("window"); for (int i = 0; i < nodes.getLength(); i++) { Node mynode = nodes.item(i); System.out.println("Property = " + mynode.getNodeName()); if (mynode.getNodeType() == Node.ELEMENT_NODE) { Element myelement = (Element) mynode; System.out.println("Theme = " + myelement.getElementsByTagName("theme").item(0).getTextContent()); System.out.println("Fullscreen = " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent()); System.out.println("Icon set = " + myelement.getElementsByTagName("icons").item(0).getTextContent()); } // close if } // close for } // close method } //close class</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><h4>使用 Java 更新 XML</h4><p>用户时不时地会改变某个偏好项,这时候 <code>org.w3c.dom</code> 库就可以帮助你更新某个 XML 元素的内容。你只需要选择这个 XML 元素,就像你读取它时那样。不过,此时你不再使用 <code>.getTextContent</code> 方法,而是使用 <code>.setTextContent</code> 方法。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">updatePref = myelement.getElementsByTagName("fullscreen").item(0); updatePref.setTextContent("1"); System.out.println("Updated fullscreen to " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent());</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>这么做会改变应用程序内存中的 XML 文档,但是还没有把数据写回到磁盘上。配合使用 <code>javax</code> 和 <code>w3c</code> 库,你就可以把读取到的 XML 内容写回到配置文件中。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer xtransform; xtransform = transformerFactory.newTransformer(); DOMSource mydom = new DOMSource(doc); StreamResult streamResult = new StreamResult(configFile); xtransform.transform(mydom, streamResult);</pre><div class="contentsignin">Nach dem Login kopieren</div></div><p>这么做会没有警告地写入转换后的数据,并覆盖掉之前的配置。</p><p>下面是完整的代码,包括更新 XML 的操作:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">package myConfigParser; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class ConfigParser { public static void main(String[] args) { Path configPath = Paths.get(System.getProperty("user.home"), ".config", "DemoXMLParser"); File configFile = new File(configPath.toString(), "myconfig.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } Document doc = null; try { doc = builder.parse(configFile); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } doc.getDocumentElement().normalize(); Node updatePref = null; // NodeList nodes = doc.getChildNodes(); NodeList nodes = doc.getElementsByTagName("window"); for (int i = 0; i < nodes.getLength(); i++) { Node mynode = nodes.item(i); System.out.println("Property = " + mynode.getNodeName()); if (mynode.getNodeType() == Node.ELEMENT_NODE) { Element myelement = (Element) mynode; System.out.println("Theme = " + myelement.getElementsByTagName("theme").item(0).getTextContent()); System.out.println("Fullscreen = " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent()); System.out.println("Icon set = " + myelement.getElementsByTagName("icons").item(0).getTextContent()); updatePref = myelement.getElementsByTagName("fullscreen").item(0); updatePref.setTextContent("2"); System.out.println("Updated fullscreen to " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent()); } // close if }// close for // write DOM back to the file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer xtransform; DOMSource mydom = new DOMSource(doc); StreamResult streamResult = new StreamResult(configFile); try { xtransform = transformerFactory.newTransformer(); xtransform.transform(mydom, streamResult); } catch (TransformerException e) { e.printStackTrace(); } } // close method } //close class</pre><div class="contentsignin">Nach dem Login kopieren</div></div><h4>如何保证配置不出问题</h4> <p>编写配置文件看上去是一个还挺简单的任务。一开始,你可能会用一个简单的文本格式,因为你的应用程序只要寥寥几个配置项而已。但是,随着你引入了更多的配置项,读取或者写入错误的数据可能会给你的应用程序带来意料之外的错误。一种帮助你保持配置过程安全、不出错的方法,就是使用类似 XML 的规范格式,然后依靠你用的编程语言的内置功能来处理这些复杂的事情。</p> <p>这也正是我喜欢使用 Java 和 XML 的原因。每当我试图读取错误的配置值时,Java 就会提醒我。通常,这是由于我在代码中试图获取的节点,并不存在于我期望的 XML 路径中。XML 这种高度结构化的格式帮助了代码保持可靠性,这对用户和开发者来说都是有好处的。</p>

Das obige ist der detaillierte Inhalt vonSo konfigurieren Sie die Java-Persistenz-XML-Datei. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!