`

eclipse xml 配置文件

    博客分类:
  • java
 
阅读更多

以下代码源自eclipse org.eclipse.ui.workbench项目下 org.eclipse.ui.XMLMemento类

稍作修改,去掉了关联类(异常而已),去掉了接口IMemento,用于操作XML配置文件.

 

/*******************************************************************************
 * Copyright (c) 2000, 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
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.w3c.dom.Text;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * This class represents the default implementation of the
 * <code>XMLMemento</code> interface.
 * <p>
 * This class is not intended to be extended by clients.
 * </p>
 * 
 * @see XMLMemento
 */
public final class XMLMemento {
	private Document factory;

	private Element element;
	public static final String TAG_ID = "IMemento.internal.id";

	/**
	 * Creates a <code>Document</code> from the <code>Reader</code> and returns
	 * a memento on the first <code>Element</code> for reading the document.
	 * <p>
	 * Same as calling createReadRoot(reader, null)
	 * </p>
	 * 
	 * @param reader
	 *            the <code>Reader</code> used to create the memento's document
	 * @return a memento on the first <code>Element</code> for reading the
	 *         document
	 * @throws Exception
	 * @throws WorkbenchException
	 *             if IO problems, invalid format, or no element.
	 */
	public static XMLMemento createReadRoot(Reader reader) throws Exception {
		return createReadRoot(reader, null);
	}

	/**
	 * Creates a <code>Document</code> from the <code>Reader</code> and returns
	 * a memento on the first <code>Element</code> for reading the document.
	 * 
	 * @param reader
	 *            the <code>Reader</code> used to create the memento's document
	 * @param baseDir
	 *            the directory used to resolve relative file names in the XML
	 *            document. This directory must exist and include the trailing
	 *            separator. The directory format, including the separators,
	 *            must be valid for the platform. Can be <code>null</code> if
	 *            not needed.
	 * @return a memento on the first <code>Element</code> for reading the
	 *         document
	 * @throws Exception
	 * @throws WorkbenchException
	 *             if IO problems, invalid format, or no element.
	 */
	public static XMLMemento createReadRoot(Reader reader, String baseDir)
			throws Exception {
		String errorMessage = null;
		Exception exception = null;

		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder parser = factory.newDocumentBuilder();
			InputSource source = new InputSource(reader);
			if (baseDir != null) {
				source.setSystemId(baseDir);
			}

			parser.setErrorHandler(new ErrorHandler() {
				/**
				 * @throws SAXException
				 */
				public void warning(SAXParseException exception)
						throws SAXException {
					// ignore
				}

				/**
				 * @throws SAXException
				 */
				public void error(SAXParseException exception)
						throws SAXException {
					// ignore
				}

				public void fatalError(SAXParseException exception)
						throws SAXException {
					throw exception;
				}
			});

			Document document = parser.parse(source);
			NodeList list = document.getChildNodes();
			for (int i = 0; i < list.getLength(); i++) {
				Node node = list.item(i);
				if (node instanceof Element) {
					return new XMLMemento(document, (Element) node);
				}
			}
		} catch (ParserConfigurationException e) {
			exception = e;
		} catch (IOException e) {
			exception = e;
		} catch (SAXException e) {
			exception = e;
		}

		String problemText = null;
		if (exception != null) {
			problemText = exception.getMessage();
		}
		if (problemText == null || problemText.length() == 0) {
			problemText = errorMessage != null ? errorMessage : "--------";
		}
		throw new Exception("");
	}

	/**
	 * Returns a root memento for writing a document.
	 * 
	 * @param type
	 *            the element node type to create on the document
	 * @return the root memento for writing a document
	 * @throws DOMException
	 */
	public static XMLMemento createWriteRoot(String type) throws DOMException {
		Document document;
		try {
			document = DocumentBuilderFactory.newInstance()
					.newDocumentBuilder().newDocument();
			Element element = document.createElement(type);
			document.appendChild(element);
			return new XMLMemento(document, element);
		} catch (ParserConfigurationException e) {
			// throw new Error(e);
			throw new Error(e.getMessage());
		}
	}

	/**
	 * Creates a memento for the specified document and element.
	 * <p>
	 * Clients should use <code>createReadRoot</code> and
	 * <code>createWriteRoot</code> to create the initial memento on a document.
	 * </p>
	 * 
	 * @param document
	 *            the document for the memento
	 * @param element
	 *            the element node for the memento
	 */
	public XMLMemento(Document document, Element element) {
		super();
		this.factory = document;
		this.element = element;
	}

	/**
	 * Creates a new child of this memento with the given type.
	 * <p>
	 * The <code>getChild</code> and <code>getChildren</code> methods are used
	 * to retrieve children of a given type.
	 * </p>
	 * 
	 * @param type
	 *            the type
	 * @return a new child memento
	 * @see #getChild
	 * @see #getChildren
	 * @throws DOMException
	 *             if the child cannot be created
	 */
	public XMLMemento createChild(String type) throws DOMException {
		Element child = factory.createElement(type);
		element.appendChild(child);
		return new XMLMemento(factory, child);
	}

	/**
	 * Creates a new child of this memento with the given type and id. The id is
	 * stored in the child memento (using a special reserved key,
	 * <code>TAG_ID</code>) and can be retrieved using <code>getId</code>.
	 * <p>
	 * The <code>getChild</code> and <code>getChildren</code> methods are used
	 * to retrieve children of a given type.
	 * </p>
	 * 
	 * @param type
	 *            the type
	 * @param id
	 *            the child id
	 * @return a new child memento with the given type and id
	 * @see #getID
	 * @throws DOMException
	 *             if the child cannot be created
	 */
	public XMLMemento createChild(String type, String id) throws DOMException {
		Element child = factory.createElement(type);
		child.setAttribute(TAG_ID, id == null ? "" : id); //$NON-NLS-1$
		element.appendChild(child);
		return new XMLMemento(factory, child);
	}

	/**
	 * Create a copy of the child node and append it to this node.
	 * 
	 * @param child
	 * @return An IMenento for the new child node.
	 * @throws DOMException
	 *             if the child cannot be created
	 */
	public XMLMemento copyChild(XMLMemento child) throws DOMException {
		Element childElement = ((XMLMemento) child).element;
		Element newElement = (Element) factory.importNode(childElement, true);
		element.appendChild(newElement);
		return new XMLMemento(factory, newElement);
	}

	/*
	 * (non-Javadoc) Method declared in XMLMemento.
	 */
	public XMLMemento getChild(String type) {

		// Get the nodes.
		NodeList nodes = element.getChildNodes();
		int size = nodes.getLength();
		if (size == 0) {
			return null;
		}

		// Find the first node which is a child of this node.
		for (int nX = 0; nX < size; nX++) {
			Node node = nodes.item(nX);
			if (node instanceof Element) {
				Element element = (Element) node;
				if (element.getNodeName().equals(type)) {
					return new XMLMemento(factory, element);
				}
			}
		}

		// A child was not found.
		return null;
	}

	/*
	 * (non-Javadoc) Method declared in XMLMemento.
	 */
	public XMLMemento[] getChildren(String type) {

		// Get the nodes.
		NodeList nodes = element.getChildNodes();
		int size = nodes.getLength();
		if (size == 0) {
			return new XMLMemento[0];
		}

		// Extract each node with given type.
		ArrayList<Element> list = new ArrayList<Element>(size);
		for (int nX = 0; nX < size; nX++) {
			Node node = nodes.item(nX);
			if (node instanceof Element) {
				Element element = (Element) node;
				if (element.getNodeName().equals(type)) {
					list.add(element);
				}
			}
		}

		// Create a memento for each node.
		size = list.size();
		XMLMemento[] results = new XMLMemento[size];
		for (int x = 0; x < size; x++) {
			results[x] = new XMLMemento(factory, list.get(x));
		}
		return results;
	}

	/*
	 * (non-Javadoc) Method declared in XMLMemento.
	 */
	public Float getFloat(String key) {
		Attr attr = element.getAttributeNode(key);
		if (attr == null) {
			return null;
		}
		String strValue = attr.getValue();
		try {
			return new Float(strValue);
		} catch (NumberFormatException e) {
			//            WorkbenchPlugin.log("Memento problem - Invalid float for key: " //$NON-NLS-1$
			//                    + key + " value: " + strValue, e); //$NON-NLS-1$
			return null;
		}
	}

	/**
	 * @since 3.4
	 */
	public String getType() {
		return element.getNodeName();
	}

	/*
	 * (non-Javadoc) Method declared in XMLMemento.
	 */
	public String getID() {
		return element.getAttribute(TAG_ID);
	}

	/*
	 * (non-Javadoc) Method declared in XMLMemento.
	 */
	public Integer getInteger(String key) {
		Attr attr = element.getAttributeNode(key);
		if (attr == null) {
			return null;
		}
		String strValue = attr.getValue();
		try {
			return new Integer(strValue);
		} catch (NumberFormatException e) {
			// WorkbenchPlugin
			//                    .log("Memento problem - invalid integer for key: " + key //$NON-NLS-1$
			//                            + " value: " + strValue, e); //$NON-NLS-1$
			return null;
		}
	}

	/*
	 * (non-Javadoc) Method declared in XMLMemento.
	 */
	public String getString(String key) {
		Attr attr = element.getAttributeNode(key);
		if (attr == null) {
			return null;
		}
		return attr.getValue();
	}

	/**
	 * @since 3.4
	 */
	public Boolean getBoolean(String key) {
		Attr attr = element.getAttributeNode(key);
		if (attr == null) {
			return null;
		}
		return Boolean.valueOf(attr.getValue());
	}

	/**
	 * Returns the data of the Text node of the memento. Each memento is allowed
	 * only one Text node.
	 * 
	 * @return the data of the Text node of the memento, or <code>null</code> if
	 *         the memento has no Text node.
	 * @since 2.0
	 * @throws DOMException
	 *             if the text node is too big
	 */
	public String getTextData() throws DOMException {
		Text textNode = getTextNode();
		if (textNode != null) {
			return textNode.getData();
		}
		return null;
	}

	/**
	 * @since 3.4
	 */
	public String[] getAttributeKeys() {
		NamedNodeMap map = element.getAttributes();
		int size = map.getLength();
		String[] attributes = new String[size];
		for (int i = 0; i < size; i++) {
			Node node = map.item(i);
			attributes[i] = node.getNodeName();
		}
		return attributes;
	}

	/**
	 * Returns the Text node of the memento. Each memento is allowed only one
	 * Text node.
	 * 
	 * @return the Text node of the memento, or <code>null</code> if the memento
	 *         has no Text node.
	 */
	private Text getTextNode() {
		// Get the nodes.
		NodeList nodes = element.getChildNodes();
		int size = nodes.getLength();
		if (size == 0) {
			return null;
		}
		for (int nX = 0; nX < size; nX++) {
			Node node = nodes.item(nX);
			if (node instanceof Text) {
				return (Text) node;
			}
		}
		// a Text node was not found
		return null;
	}

	/**
	 * Places the element's attributes into the document.
	 * 
	 * @param copyText
	 *            true if the first text node should be copied
	 * @throws DOMException
	 *             if the attributes or children cannot be copied to this node.
	 */
	private void putElement(Element element, boolean copyText)
			throws DOMException {
		NamedNodeMap nodeMap = element.getAttributes();
		int size = nodeMap.getLength();
		for (int i = 0; i < size; i++) {
			Attr attr = (Attr) nodeMap.item(i);
			putString(attr.getName(), attr.getValue());
		}

		NodeList nodes = element.getChildNodes();
		size = nodes.getLength();
		// Copy first text node (fixes bug 113659).
		// Note that text data will be added as the first child (see
		// putTextData)
		boolean needToCopyText = copyText;
		for (int i = 0; i < size; i++) {
			Node node = nodes.item(i);
			if (node instanceof Element) {
				XMLMemento child = (XMLMemento) createChild(node.getNodeName());
				child.putElement((Element) node, true);
			} else if (node instanceof Text && needToCopyText) {
				putTextData(((Text) node).getData());
				needToCopyText = false;
			}
		}
	}

	/**
	 * Sets the value of the given key to the given floating point number.
	 * 
	 * @param key
	 *            the key
	 * @param f
	 *            the value
	 * @throws DOMException
	 *             if the attribute cannot be set
	 */
	public void putFloat(String key, float f) throws DOMException {
		element.setAttribute(key, String.valueOf(f));
	}

	/**
	 * Sets the value of the given key to the given integer.
	 * 
	 * @param key
	 *            the key
	 * @param n
	 *            the value
	 * @throws DOMException
	 *             if the attribute cannot be set
	 */
	public void putInteger(String key, int n) throws DOMException {
		element.setAttribute(key, String.valueOf(n));
	}

	/**
	 * Copy the attributes and children from <code>memento</code> to the
	 * receiver.
	 * 
	 * @param memento
	 *            the XMLMemento to be copied.
	 * @throws DOMException
	 *             if the attributes or children cannot be copied to this node.
	 */
	public void putMemento(XMLMemento memento) throws DOMException {
		// Do not copy the element's top level text node (this would overwrite
		// the existing text).
		// Text nodes of children are copied.
		putElement(((XMLMemento) memento).element, false);
	}

	/**
	 * Sets the value of the given key to the given string.
	 * 
	 * @param key
	 *            the key
	 * @param value
	 *            the value
	 * @throws DOMException
	 *             if the attribute cannot be set
	 */
	public void putString(String key, String value) throws DOMException {
		if (value == null) {
			return;
		}
		element.setAttribute(key, value);
	}

	/**
	 * Sets the value of the given key to the given boolean value.
	 * 
	 * @param key
	 *            the key
	 * @param value
	 *            the value
	 * @since 3.4
	 * @throws DOMException
	 *             if the attribute cannot be set
	 */
	public void putBoolean(String key, boolean value) throws DOMException {
		element.setAttribute(key, value ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$
	}

	/**
	 * Sets the memento's Text node to contain the given data. Creates the Text
	 * node if none exists. If a Text node does exist, it's current contents are
	 * replaced. Each memento is allowed only one text node.
	 * 
	 * @param data
	 *            the data to be placed on the Text node
	 * @since 2.0
	 * @throws DOMException
	 *             if the text node cannot be created under this node.
	 */
	public void putTextData(String data) throws DOMException {
		Text textNode = getTextNode();
		if (textNode == null) {
			textNode = factory.createTextNode(data);
			// Always add the text node as the first child (fixes bug 93718)
			element.insertBefore(textNode, element.getFirstChild());
		} else {
			textNode.setData(data);
		}
	}

	/**
	 * Saves this memento's document current values to the specified writer.
	 * 
	 * @param writer
	 *            the writer used to save the memento's document
	 * @throws IOException
	 *             if there is a problem serializing the document to the stream.
	 */
	public void save(Writer writer) throws IOException {
		DOMWriter out = new DOMWriter(writer);
		try {
			out.print(element);
		} finally {
			out.close();
		}
	}

	/**
	 * A simple XML writer. Using this instead of the javax.xml.transform
	 * classes allows compilation against JCL Foundation (bug 80053).
	 */
	private static final class DOMWriter extends PrintWriter {

		/* constants */
		private static final String XML_VERSION = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; //$NON-NLS-1$

		/**
		 * Creates a new DOM writer on the given output writer.
		 * 
		 * @param output
		 *            the output writer
		 */
		public DOMWriter(Writer output) {
			super(output);
			println(XML_VERSION);
		}

		/**
		 * Prints the given element.
		 * 
		 * @param element
		 *            the element to print
		 */
		public void print(Element element) {
			// Ensure extra whitespace is not emitted next to a Text node,
			// as that will result in a situation where the restored text data
			// is not the
			// same as the saved text data.
			boolean hasChildren = element.hasChildNodes();
			startTag(element, hasChildren);
			if (hasChildren) {
				boolean prevWasText = false;
				NodeList children = element.getChildNodes();
				for (int i = 0; i < children.getLength(); i++) {
					Node node = children.item(i);
					if (node instanceof Element) {
						if (!prevWasText) {
							println();
						}
						print((Element) children.item(i));
						prevWasText = false;
					} else if (node instanceof Text) {
						print(getEscaped(node.getNodeValue()));
						prevWasText = true;
					}
				}
				if (!prevWasText) {
					println();
				}
				endTag(element);
			}
		}

		private void startTag(Element element, boolean hasChildren) {
			StringBuffer sb = new StringBuffer();
			sb.append("<"); //$NON-NLS-1$
			sb.append(element.getTagName());
			NamedNodeMap attributes = element.getAttributes();
			for (int i = 0; i < attributes.getLength(); i++) {
				Attr attribute = (Attr) attributes.item(i);
				sb.append(" "); //$NON-NLS-1$
				sb.append(attribute.getName());
				sb.append("=\""); //$NON-NLS-1$
				sb.append(getEscaped(String.valueOf(attribute.getValue())));
				sb.append("\""); //$NON-NLS-1$
			}
			sb.append(hasChildren ? ">" : "/>"); //$NON-NLS-1$ //$NON-NLS-2$
			print(sb.toString());
		}

		private void endTag(Element element) {
			StringBuffer sb = new StringBuffer();
			sb.append("</"); //$NON-NLS-1$
			sb.append(element.getNodeName());
			sb.append(">"); //$NON-NLS-1$
			print(sb.toString());
		}

		private static void appendEscapedChar(StringBuffer buffer, char c) {
			String replacement = getReplacement(c);
			if (replacement != null) {
				buffer.append('&');
				buffer.append(replacement);
				buffer.append(';');
			} else if (c == 9 || c == 10 || c == 13 || c >= 32) {
				buffer.append(c);
			}
		}

		private static String getEscaped(String s) {
			StringBuffer result = new StringBuffer(s.length() + 10);
			for (int i = 0; i < s.length(); ++i) {
				appendEscapedChar(result, s.charAt(i));
			}
			return result.toString();
		}

		private static String getReplacement(char c) {
			// Encode special XML characters into the equivalent character
			// references.
			// The first five are defined by default for all XML documents.
			// The next three (#xD, #xA, #x9) are encoded to avoid them
			// being converted to spaces on deserialization
			// (fixes bug 93720)
			switch (c) {
			case '<':
				return "lt"; //$NON-NLS-1$
			case '>':
				return "gt"; //$NON-NLS-1$
			case '"':
				return "quot"; //$NON-NLS-1$
			case '\'':
				return "apos"; //$NON-NLS-1$
			case '&':
				return "amp"; //$NON-NLS-1$
			case '\r':
				return "#x0D"; //$NON-NLS-1$
			case '\n':
				return "#x0A"; //$NON-NLS-1$
			case '\u0009':
				return "#x09"; //$NON-NLS-1$
			}
			return null;
		}
	}
}
 

 

分享到:
评论

相关推荐

    Eclipse XML自动提示DTD文件下载

    标题中的“Eclipse XML自动提示DTD文件下载”指的是在使用Eclipse IDE进行XML开发...对于像Hibernate和Struts这样的框架,理解并正确配置其DTD是非常关键的,因为这些框架的XML配置文件都依赖于特定的DTD来定义其结构。

    xmlbuddy eclipse插件,编写xml文件

    这款插件对于开发者,特别是那些在处理Hibernate等框架时需要频繁与XML配置文件打交道的人来说,是非常实用的工具。 首先,XMLBuddy提供了丰富的语法高亮和代码自动完成功能。它能够智能识别XML标签、属性和值,...

    eclipse xml 开源 插件

    例如,可以集成Java项目的构建过程,使得XML配置文件的修改能即时反映到项目中。 5. **插件安装与管理**: Eclipse的"软件更新"功能允许用户方便地查找、安装和管理插件。开发者可以在Eclipse Marketplace或其他开源...

    android studio Eclipse Code Formatter配置文件xml下载

    androidstudio java代码eclipse风格的代码格式化配置文件。 1.插件安装:Androidstudio插件市场安装Adapter for Eclipse ...3.xml配置文件在附件中 4.默认快捷键 CTRL+ALT+L快速格式化代码,比如缩进、对齐、空格等

    spring bean XML配置入门

    Spring容器通过XML配置文件或注解来定义Bean及其相互关系。 3. **XML配置文件**: "spring-beans"是Spring中用于配置Bean的XML文件。该文件包含了一系列的元素,每个元素表示一个Java对象的定义,包括类名、属性值...

    Configuration对properties、xml配置文件的【增删改查】及动态加载

    XML配置文件的处理使用`XMLConfiguration`类。同样,通过指定文件路径,可以创建配置实例并获取配置信息。 2. **写入XML配置文件** 添加、修改XML配置使用`setProperty()`方法,删除则使用`removeProperty()`。保存...

    eclipse编辑xml没有提示的解决办法

    在使用Eclipse开发Java项目时,XML文件是常见的配置文件,但有时我们可能会遇到一个困扰:在编辑XML文件时,Eclipse没有提供自动提示功能,这无疑会降低我们的开发效率。这个问题的出现可能是由于Eclipse的相关插件...

    xml配置文件快捷提示

    本篇将深入探讨XML配置文件中的快捷提示和配置方法,以帮助开发者快速理解和应用。 首先,XML配置文件的核心是元素(Element),它是XML文档的基本构建块。每个元素都有一个标签(Tag),例如`&lt;element&gt;`,并在开始...

    Eclipse格式模板XML文件

    Eclipse格式模板XML文件的结构通常包括键值对,其中键代表配置选项,值代表该选项的具体设置。例如,`org.eclipse.jdt.core.formatter.tabulation.char`用于设置缩进字符,而`org.eclipse.jdt.core.formatter....

    maven setting.xml配置文件下载

    用于maven setting.xml文件丢失,eclipse集成maven插件.m2下无setting.xml文件需要配置的情况

    maven settings.xml配置文件

    maven settings.xml配置文件,亲试无问题,可以使用,eclipse和Myeclipse都可以

    eclipse配置文件没有提示问题解决方案.docx

    本文将详细介绍如何解决Eclipse中配置文件(特别是Spring框架相关的XML配置文件)没有代码提示的问题。 #### 解决方案 本解决方案主要针对Spring框架的XML配置文件,通过引入schema约束来实现代码提示功能。具体...

    Eclipse使用XML配置SSM框架项目.zip

    通过这个项目,开发者不仅可以了解SSM框架的集成方式,还能学习到如何在Eclipse中进行项目配置,以及如何使用XML配置文件来实现业务逻辑。此外,实践中遇到的问题也会加深对SSM框架理解,提升问题解决能力。

    Eclipse代码格式化配置文件.xml

    Eclipse代码格式化配置文件.xml

    我的eclipse配置文件

    我的Eclipse CDT配置文件,设置了语法高亮等常用配置。

    eclipse格式化文件(xml)

    这个"eclipse的代码格式化文件"就是一个预设好的格式化配置,你可以将其导入到Eclipse中,以便在编辑XML文件时自动应用这些格式规则。 导入步骤通常如下: 1. 打开Eclipse,选择`Window` -&gt; `Preferences`进入设置...

    eclipse中xml文件里自动提示消失解决办法

    ### Eclipse中XML文件里自动提示消失解决办法 在Eclipse这款强大的开源集成开发环境中,XML文件的编写是非常常见的任务之一。然而,在实际操作过程中,不少用户可能会遇到XML文件中的自动提示功能突然消失的问题,...

    jetty在eclipse中配置

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,它被广泛用于开发、测试和部署Web应用程序。...而"jetty.rar"文件可能是包含Jetty服务器的示例或者额外配置文件,你可以根据需要解压查看。

    Eclipse schema XML 提示

    Spring Framework的bean配置通常遵循特定的XSD文件,这些文件定义了Spring配置文件的元素和属性。 2. **配置Eclipse的XML Catalog**: - 打开Eclipse,转到`Window`菜单,然后选择`Preferences`。 - 在偏好设置...

    eclipsexml備注.7zeclipsexml備注.7z

    标题中的“eclipsexml備注.7z”很可能是一个使用7-Zip软件压缩的文件,该文件主要用于存储与Eclipse IDE相关的XML配置或注释信息。Eclipse是一款流行的开源集成开发环境(IDE),广泛用于Java和其他语言的开发。XML...

Global site tag (gtag.js) - Google Analytics