목차
1) Apache Commons 구성 프레임워크는
사용 이점
파싱 코드가 시작됩니다
XPath 표현은
환경 변수 액세스
Joint 구성
통합 관리 모듈성
자동 다시 로드
1)DOM(JAXP Crimson解析器)
2)SAX
1)Apache Commons Configuration framework框架使用
使用好处
解析代码开始了
XPath表达式使用
访问环境变量
联合配置
统一管理模块化
自动重新加载
백엔드 개발 XML/RSS 튜토리얼 Apache Commons 구성은 xml 구성을 읽습니다.

Apache Commons 구성은 xml 구성을 읽습니다.

Feb 17, 2017 pm 03:33 PM


최근 프로젝트는 문자열 연결 풀을 직접 작성하는 것입니다. 환경이 다르기 때문에 개발 버전, 테스트 버전, 온라인 버전이 있고 각 버전에서 사용하는 데이터베이스도 다릅니다. 따라서 데이터베이스 연결을 유연하게 전환할 필요가 있습니다. 물론 이는 maven을 사용하여 해결할 수 있다. Apache Commons 구성 프레임워크는 주로 데이터베이스 연결 문자열을 구문 분석하는 데 사용됩니다.
다음은 Apache Commons Configuration 프레임워크의 공통 부분을 소개합니다.

1) Apache Commons 구성 프레임워크는

**

  • 을 사용하여 jar 패키지 http://www.php.cn/ 또는 http를 다운로드합니다. : //www.php.cn/ api 사용법을 공부하려면 maven에서

  • 을 검색하고 다운로드하세요.

사용 이점

  • ·xml 구조가 크게 변경될 경우 xml 파싱 코드를 크게 수정할 필요가 없습니다

  • 사용자는 자신의 구문 분석 구문 트리만 수정하면 됩니다.

  • 고객은 구문 분석을 위해 구문 트리 프레임워크를 수정하기만 하면 됩니다. 생각의 출발점은 디자인 패턴에서 인터프리터 패턴과 유사한지 여부입니다. 추상 구문 트리를 구축하고 실행을 해석합니다.

  • 사용자는 자신의 구문 분석 구문 트리에만 관심을 갖고 수정하면 됩니다.

  • 사용자는 구문 분석 방법에 대해 걱정할 필요가 없으며 해당 구문 분석 문법 규칙을 구성하기만 하면 됩니다.

  • xml 구성 구조가 변경된 후 프로그램을 단순화하고 코드를 대폭 수정합니다.

    먼저 Maven을 구성합니다.

 <dependency>
        <groupId>commons-configuration</groupId>
        <artifactId>commons-configuration</artifactId>
        <version>1.8</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.8.0</version>
    </dependency>
    <dependency>
        <groupId>commons-jxpath</groupId>
        <artifactId>commons-jxpath</artifactId>
        <version>1.3</version>
    </dependency>
로그인 후 복사
로그인 후 복사

다음 내용으로 springok1.xml을 정의하세요
Apache Commons 구성은 xml 구성을 읽습니다.

<?xml version="1.0" encoding="UTF-8"?><!-- springok1.xml --><config>
    <database>
        <url>127.0.0.1</url>
        <port>3306</port>
        <login>admin</login>
        <password></password>
    </database></config>
로그인 후 복사
로그인 후 복사

파싱 코드가 시작됩니다

public static void main(String[] args) throws Exception {
        XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        System.out.println(conf.getString("database.url"));
        System.out.println(conf.getString("database.port"));
        System.out.println(conf.getString("database.login"));
        System.out.println(conf.getString("database.password"));
    }
로그인 후 복사
로그인 후 복사

출력은 다음과 같습니다: xml이 성공적으로 구문 분석되었음을 나타냅니다.
127.0.0.1
3306
admin
획득 방법 AbstractConfiguration 메서드에서 찾을 수 있는 더 자세한 획득 방법이 많이 있습니다.
위 구성은 하나의 데이터베이스에 대한 연결 정보입니다. 여러 데이터베이스의 연결 정보를 구성한 경우 연결 정보를 파싱하고 전환하는 방법입니다. 다중 연결을 구성하기 위해 springok1.xml의 정보를 다음과 같이 수정합니다.

<?xml version="1.0" encoding="UTF-8"?><!-- springok1.xml --><config><databases>
    <database>
        <url>127.0.0.1</url>
        <port>3306</port>
        <login>admin</login>
        <password></password>
    </database>
    <database>
        <url>127.0.0.1</url>
        <port>3302</port>
        <login>admin</login>
        <password>admin</password>
    </database></databases></config>
로그인 후 복사
로그인 후 복사

이제 두 구성 데이터베이스의 연결 정보를 얻고 싶다고 가정합니다. 절차는 다음과 같습니다.

    public static void main(String[] args) throws Exception {
        XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        System.out.println(conf.getString("databases.database(0).url"));
        System.out.println(conf.getString("databases.database(0).port"));
        System.out.println(conf.getString("databases.database(0).login"));
        System.out.println(conf.getString("databases.database(0).password"));
        System.out.println(conf.getString("databases.database(1).url"));
        System.out.println(conf.getString("databases.database(1).port"));
        System.out.println(conf.getString("databases.database(1).login"));
        System.out.println(conf.getString("databases.database(1).password"));
    }
로그인 후 복사
로그인 후 복사

출력 :
127.0.0.1
3306
admin

127.0.0.1
3302
admin
admin

파싱해도 괜찮습니다.
이전 구성 파일 예시를 보면 실제 전투에서 동일한 태그가 여러 개 있을 경우 인덱스가 0부터 시작하는 것을 확인했습니다.

XPath 표현은

포인트 액세스 방법을 사용합니다. 위 방법은 문제가 되지 않습니다. 일부 복잡한 구성의 경우 XPath 표현 언어를 사용해야 할 수도 있습니다. 여기서 가장 큰 장점은 XML의 고급 쿼리를 사용하면 프로그램이 여전히 상대적으로 단순하고 이해하기 쉬워 보인다는 것입니다. 이해도가 높습니다.
Apache Commons 구성은 xml 구성을 읽습니다.
또는 위의 springok.xml 파일을 구문 분석하세요. 코드는 다음과 같습니다.

  XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        conf.setExpressionEngine(new XPathExpressionEngine());
        System.out.println(conf.getString("databases/database[port=&#39;3306&#39;]/url"));
        System.out.println(conf.getString("databases/database[port=&#39;3302&#39;]/port"));
로그인 후 복사
로그인 후 복사

출력:
127.0.0.1
3302
테스트 성공.

환경 변수 액세스

EnvironmentConfiguration conf=new EnvironmentConfiguration();
        System.out.println(conf.getMap());
로그인 후 복사
로그인 후 복사

구현 방법 소스 코드 분석:

public EnvironmentConfiguration()
    {        super(new HashMap<String, Object>(System.getenv()));
    }
로그인 후 복사
로그인 후 복사

Joint 구성

Joint 1 및 2 방법. 시스템 변수에 연결해야 하는 데이터베이스 문자열 키를 정의하고 구문 분석 중에 동적 로딩을 얻을 수 있습니까? ?

아아아아

테스트는 괜찮습니다. 문제 없습니다.

통합 관리 모듈성

xml 구성은 아래와 같습니다.

Apache Commons 구성은 xml 구성을 읽습니다.
public String getDbUrl()throws ConfigurationException {
DefaultConfigurationBuilder 빌더 =
새로운 DefaultConfigurationBuilder(“config.xml”)
부울 로드 =true
CombinedConfiguration config = builder.getConfiguration(load)
config.setExpressionEngine(new XPathExpressionEngine())
문자열 env = config.getString("ENV_TYPE")
if(“dev”.equals(env) ||”production”.equals(env)) {
문자열 xpath =”데이터베이스/데이터베이스[이름 = '”+ env +”']/url”
config.getString(xpath) 반환
}그밖에{
String msg =”ENV_TYPE 환경 변수는 “+
입니다. "제대로 설정되지 않았습니다"
새로운 IllegalStateException(msg) 발생
}
}

자동 다시 로드

로딩 전략을 설정할 수 있으므로 파일 기반 구성이 변경되면 자동으로 로드됩니다. 프레임워크는 구성 파일을 폴링하고 파일 내용이 변경되면 구성 개체가 새로 고쳐집니다. 프로그램 제어를 사용할 수 있습니다:

public String getDbUrl() throws ConfigurationException {
    EnvironmentConfiguration envConfig =new EnvironmentConfiguration();    String env = envConfig.getString("ENV_TYPE");    if("dev".equals(env) ||"production".equals(env)) {
        XMLConfiguration xmlConfig =new XMLConfiguration("springok1.xml");
        xmlConfig.setExpressionEngine(new XPathExpressionEngine());        String xpath ="databases/database[name = &#39;"+ env +"&#39;]/url";        return xmlConfig.getString(xpath);
    }else{        String msg ="ENV_TYPE environment variable is "+
                     "not properly set";
        throw new IllegalStateException(msg);
    }
}
로그인 후 복사
로그인 후 복사

또는 구성 중 제어:

<?xmlversion="1.0"encoding="UTF-8"?><!-- config.xml --><configuration>
  <env/>
  <xmlfileName="const.xml">
    <reloadingStrategyrefreshDelay="5000"      config-class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy"/>
  </xml></configuration>
로그인 후 복사
로그인 후 복사

下面是dom和sax方式的手动解析方式可参考使用。
java语言中xml解析有很多种方式,最流行的方式有sax和dom两种。
1. dom是把所有的解析内容一次性加入内存所以xml内容大的话性能不好。
2. sax是驱动解析。所以内存不会占用太多。(spring用的就是sax解析方式)

需要什么包自己到网上找下吧?
xml文件如下:

<?xml version="1.0" encoding="GB2312"?> 
<RESULT> 
<VALUE> 
   <NO>springok1</NO> 
   <ADDR>springok</ADDR> 
</VALUE> 
<VALUE> 
   <NO>springok2</NO> 
   <ADDR>springok</ADDR> 
</VALUE> 
</RESULT>
로그인 후 복사
로그인 후 복사

1)DOM(JAXP Crimson解析器)

DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。
로그인 후 복사
로그인 후 복사
import java.io.*; import java.util.*; import org.w3c.dom.*; import javax.xml.parsers.*; public class MyXMLReader{ 
 public static void main(String arge[]){ 

  long lasting =System.currentTimeMillis();   try{ 
   File f=new File("data_10k.xml");    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();    DocumentBuilder builder=factory.newDocumentBuilder();    Document doc = builder.parse(f);    NodeList nl = doc.getElementsByTagName("VALUE");    for (int i=0;i<nl.getLength();i++){     System.out.print("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());     System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());    } 
  }catch(Exception e){ 
   e.printStackTrace(); }
로그인 후 복사
로그인 후 복사

2)SAX

SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。

选择DOM还是选择SAX? 对于需要自己编写代码来处理XML文档的开发人员来说, 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。

DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。

SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
로그인 후 복사
로그인 후 복사
import org.xml.sax.*; 
import org.xml.sax.helpers.*; 
import javax.xml.parsers.*; 

public class MyXMLReader extends DefaultHandler {  java.util.Stack tags = new java.util.Stack(); 
 public MyXMLReader() { 
  super(); 
} 

 public static void main(String args[]) { 
  long lasting = System.currentTimeMillis(); 
  try { 
   SAXParserFactory sf = SAXParserFactory.newInstance(); 
   SAXParser sp = sf.newSAXParser(); 
   MyXMLReader reader = new MyXMLReader(); 
   sp.parse(new InputSource("data_10k.xml"), reader); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 

  System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");} 
  public void characters(char ch[], int start, int length) throws SAXException { 
  String tag = (String) tags.peek(); 
  if (tag.equals("NO")) { 
   System.out.print("车牌号码:" + new String(ch, start, length)); 
} 
if (tag.equals("ADDR")) { 
  System.out.println("地址:" + new String(ch, start, length)); 
} 
} 

  public void startElement(String uri,String localName,String qName,Attributes attrs) { 
  tags.push(qName);} 
}
로그인 후 복사
로그인 후 복사

**

总结:个人喜欢这个框架,支持定时刷新、xpath、import方式。

近期项目自己手写一个字符串连接池。因为环境不同有开发版本、测试版本、上线版本、每一个版本用到的数据库也是不一样的。所以需要能灵活的切换数据库连接。当然这个用maven就解决了。Apache Commons Configuration 框架用的主要是解析数据库连接字符串。
下面介绍Apache Commons Configuration 框架的常用部分。

1)Apache Commons Configuration framework框架使用

**

  • 下载jar包http://www.php.cn/或者http://www.php.cn/ maven中搜索下载

  • 研究api的使用。

使用好处

  • ·当xml结构大变化的时候不用过多的修改解析xml的代码

  • 用户只需要修改自己的解析语法树即可。

  • 客户只需要修改语法树框架去解析,思考的起点是不是跟设计模式中的解释器模式类似。构建抽象语法树并解释执行。

  • 用户只需要关心和修改自己的解析语法树即可。

  • 用户不用关系如何解析只需要配置对应的解析语法规则即可。

  • 简化程序xml配置结构变化后大幅度的修改代码。

    首先先配置一下Maven。

 <dependency>
        <groupId>commons-configuration</groupId>
        <artifactId>commons-configuration</artifactId>
        <version>1.8</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.8.0</version>
    </dependency>
    <dependency>
        <groupId>commons-jxpath</groupId>
        <artifactId>commons-jxpath</artifactId>
        <version>1.3</version>
    </dependency>
로그인 후 복사
로그인 후 복사

定义一个springok1.xml内容如下
Apache Commons 구성은 xml 구성을 읽습니다.

<?xml version="1.0" encoding="UTF-8"?><!-- springok1.xml --><config>
    <database>
        <url>127.0.0.1</url>
        <port>3306</port>
        <login>admin</login>
        <password></password>
    </database></config>
로그인 후 복사
로그인 후 복사

解析代码开始了

public static void main(String[] args) throws Exception {
        XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        System.out.println(conf.getString("database.url"));
        System.out.println(conf.getString("database.port"));
        System.out.println(conf.getString("database.login"));
        System.out.println(conf.getString("database.password"));
    }
로그인 후 복사
로그인 후 복사

输出如下:说明已经成功解析xml了。
127.0.0.1
3306
admin
获取的方法有很多种更详细的获取方法可以从AbstractConfiguration方法中对应找到。
上面配置的是一个数据库的连接信息,如果配置很多数据库的连接信息,怎么解析连接信息切换呢。修改springok1.xml的信息为多个连接配置如下:

<?xml version="1.0" encoding="UTF-8"?><!-- springok1.xml --><config><databases>
    <database>
        <url>127.0.0.1</url>
        <port>3306</port>
        <login>admin</login>
        <password></password>
    </database>
    <database>
        <url>127.0.0.1</url>
        <port>3302</port>
        <login>admin</login>
        <password>admin</password>
    </database></databases></config>
로그인 후 복사
로그인 후 복사

现在假设我们要获取两个的配置数据库连接信息,程序如下:

    public static void main(String[] args) throws Exception {
        XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        System.out.println(conf.getString("databases.database(0).url"));
        System.out.println(conf.getString("databases.database(0).port"));
        System.out.println(conf.getString("databases.database(0).login"));
        System.out.println(conf.getString("databases.database(0).password"));
        System.out.println(conf.getString("databases.database(1).url"));
        System.out.println(conf.getString("databases.database(1).port"));
        System.out.println(conf.getString("databases.database(1).login"));
        System.out.println(conf.getString("databases.database(1).password"));
    }
로그인 후 복사
로그인 후 복사

输出:
127.0.0.1
3306
admin

127.0.0.1
3302
admin
admin

解析ok,
结合前面的配置文件的例子跟实战我们发现多个相同的标签的话索引是从0开始的。

XPath表达式使用

点的访问方式上面的那种方式是没问题,对于一些复杂的配置来讲,我们可能需要使用XPath表达式语言。这里的主要优点是,使用了XML的高级查询,程序看起来仍然比较简洁易懂。可理解性高。
Apache Commons 구성은 xml 구성을 읽습니다.
还是解析上面的springok.xml文件。代码如下:

  XMLConfiguration conf=new XMLConfiguration("springok1.xml");
        conf.setExpressionEngine(new XPathExpressionEngine());
        System.out.println(conf.getString("databases/database[port=&#39;3306&#39;]/url"));
        System.out.println(conf.getString("databases/database[port=&#39;3302&#39;]/port"));
로그인 후 복사
로그인 후 복사

输出:
127.0.0.1
3302
测试ok.

访问环境变量

EnvironmentConfiguration conf=new EnvironmentConfiguration();
        System.out.println(conf.getMap());
로그인 후 복사
로그인 후 복사

源码分析如何实现:

public EnvironmentConfiguration()
    {        super(new HashMap<String, Object>(System.getenv()));
    }
로그인 후 복사
로그인 후 복사

联合配置

联合一和2两种方式,是不是我们可以再系统变量中定义一个需要连接的数据库字符串key,解析的时候获取动态加载呢?

public String getDbUrl() throws ConfigurationException {
    EnvironmentConfiguration envConfig =new EnvironmentConfiguration();    String env = envConfig.getString("ENV_TYPE");    if("dev".equals(env) ||"production".equals(env)) {
        XMLConfiguration xmlConfig =new XMLConfiguration("springok1.xml");
        xmlConfig.setExpressionEngine(new XPathExpressionEngine());        String xpath ="databases/database[name = &#39;"+ env +"&#39;]/url";        return xmlConfig.getString(xpath);
    }else{        String msg ="ENV_TYPE environment variable is "+
                     "not properly set";
        throw new IllegalStateException(msg);
    }
}
로그인 후 복사
로그인 후 복사

测试ok没问题。

统一管理模块化

xml配置如下图:

Apache Commons 구성은 xml 구성을 읽습니다.
public String getDbUrl()throws ConfigurationException {
DefaultConfigurationBuilder builder =
new DefaultConfigurationBuilder(“config.xml”);
boolean load =true;
CombinedConfiguration config = builder.getConfiguration(load);
config.setExpressionEngine(new XPathExpressionEngine());
String env = config.getString(“ENV_TYPE”);
if(“dev”.equals(env) ||”production”.equals(env)) {
String xpath =”databases/database[name = ‘”+ env +”’]/url”;
return config.getString(xpath);
}else{
String msg =”ENV_TYPE environment variable is “+
“not properly set”;
throw new IllegalStateException(msg);
}
}

自动重新加载

当基于文件的配置变化的时候自动加载,因为我们可以设置加载策略。框架会轮询配置文件,当文件的内容发生改变时,配置对象也会刷新。你可以用程序控制:

    XMLConfiguration config =new XMLConfiguration("springok1.xml");
        ReloadingStrategy strategy =new FileChangedReloadingStrategy();
        ((FileChangedReloadingStrategy) strategy).setRefreshDelay(5000);
        config.setReloadingStrategy(strategy);
로그인 후 복사

或者配置的时候控制:

<?xmlversion="1.0"encoding="UTF-8"?><!-- config.xml --><configuration>
  <env/>
  <xmlfileName="const.xml">
    <reloadingStrategyrefreshDelay="5000"      config-class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy"/>
  </xml></configuration>
로그인 후 복사
로그인 후 복사

下面是dom和sax方式的手动解析方式可参考使用。
java语言中xml解析有很多种方式,最流行的方式有sax和dom两种。
1. dom是把所有的解析内容一次性加入内存所以xml内容大的话性能不好。
2. sax是驱动解析。所以内存不会占用太多。(spring用的就是sax解析方式)

需要什么包自己到网上找下吧?
xml文件如下:

<?xml version="1.0" encoding="GB2312"?> 
<RESULT> 
<VALUE> 
   <NO>springok1</NO> 
   <ADDR>springok</ADDR> 
</VALUE> 
<VALUE> 
   <NO>springok2</NO> 
   <ADDR>springok</ADDR> 
</VALUE> 
</RESULT>
로그인 후 복사
로그인 후 복사

1)DOM(JAXP Crimson解析器)

DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。
로그인 후 복사
로그인 후 복사
import java.io.*; import java.util.*; import org.w3c.dom.*; import javax.xml.parsers.*; public class MyXMLReader{ 
 public static void main(String arge[]){ 

  long lasting =System.currentTimeMillis();   try{ 
   File f=new File("data_10k.xml");    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();    DocumentBuilder builder=factory.newDocumentBuilder();    Document doc = builder.parse(f);    NodeList nl = doc.getElementsByTagName("VALUE");    for (int i=0;i<nl.getLength();i++){     System.out.print("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());     System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());    } 
  }catch(Exception e){ 
   e.printStackTrace(); }
로그인 후 복사
로그인 후 복사

2)SAX

SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。

选择DOM还是选择SAX? 对于需要自己编写代码来处理XML文档的开发人员来说, 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。

DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。

SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
로그인 후 복사
로그인 후 복사
import org.xml.sax.*; 
import org.xml.sax.helpers.*; 
import javax.xml.parsers.*; 

public class MyXMLReader extends DefaultHandler {  java.util.Stack tags = new java.util.Stack(); 
 public MyXMLReader() { 
  super(); 
} 

 public static void main(String args[]) { 
  long lasting = System.currentTimeMillis(); 
  try { 
   SAXParserFactory sf = SAXParserFactory.newInstance(); 
   SAXParser sp = sf.newSAXParser(); 
   MyXMLReader reader = new MyXMLReader(); 
   sp.parse(new InputSource("data_10k.xml"), reader); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 

  System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");} 
  public void characters(char ch[], int start, int length) throws SAXException { 
  String tag = (String) tags.peek(); 
  if (tag.equals("NO")) { 
   System.out.print("车牌号码:" + new String(ch, start, length)); 
} 
if (tag.equals("ADDR")) { 
  System.out.println("地址:" + new String(ch, start, length)); 
} 
} 

  public void startElement(String uri,String localName,String qName,Attributes attrs) { 
  tags.push(qName);} 
}
로그인 후 복사
로그인 후 복사

**

总结:个人喜欢这个框架,支持定时刷新、xpath、import方式。

 以上就是Apache Commons Configuration读取xml配置的内容,更多相关内容请关注PHP中文网(www.php.cn)!


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Apache에서 CGI 디렉토리를 설정하는 방법 Apache에서 CGI 디렉토리를 설정하는 방법 Apr 13, 2025 pm 01:18 PM

Apache에서 CGI 디렉토리를 설정하려면 다음 단계를 수행해야합니다. "CGI-BIN"과 같은 CGI 디렉토리를 작성하고 Apache 쓰기 권한을 부여하십시오. Apache 구성 파일에 "Scriptalias"지시록 블록을 추가하여 CGI 디렉토리를 "/cgi-bin"URL에 매핑하십시오. Apache를 다시 시작하십시오.

Apache의 데이터베이스에 연결하는 방법 Apache의 데이터베이스에 연결하는 방법 Apr 13, 2025 pm 01:03 PM

Apache는 데이터베이스에 연결하여 다음 단계가 필요합니다. 데이터베이스 드라이버 설치. 연결 풀을 만들려면 Web.xml 파일을 구성하십시오. JDBC 데이터 소스를 작성하고 연결 설정을 지정하십시오. JDBC API를 사용하여 Connections, 명세서 작성, 매개 변수 바인딩, 쿼리 또는 업데이트 실행 및 처리를 포함하여 Java 코드의 데이터베이스에 액세스하십시오.

아파치를 시작하는 방법 아파치를 시작하는 방법 Apr 13, 2025 pm 01:06 PM

Apache를 시작하는 단계는 다음과 같습니다. Apache 설치 (명령 : Sudo apt-get Apache2를 설치하거나 공식 웹 사이트에서 다운로드) 시작 apache (linux : sudo systemctl start : windes (선택 사항, Linux : Sudo SystemCtl

Apache80 포트가 점유 된 경우해야 할 일 Apache80 포트가 점유 된 경우해야 할 일 Apr 13, 2025 pm 01:24 PM

Apache 80 포트가 점유되면 솔루션은 다음과 같습니다. 포트를 차지하고 닫는 프로세스를 찾으십시오. 방화벽 설정을 확인하여 Apache가 차단되지 않았는지 확인하십시오. 위의 방법이 작동하지 않으면 Apache를 재구성하여 다른 포트를 사용하십시오. Apache 서비스를 다시 시작하십시오.

Apache의 서버 이름 이상을 삭제하는 방법 Apache의 서버 이름 이상을 삭제하는 방법 Apr 13, 2025 pm 01:09 PM

Apache에서 추가 ServerName 지시문을 삭제하려면 다음 단계를 수행 할 수 있습니다. 추가 ServerName Directive를 식별하고 삭제하십시오. Apache를 다시 시작하여 변경 사항이 적용됩니다. 구성 파일을 확인하여 변경 사항을 확인하십시오. 서버를 테스트하여 문제가 해결되었는지 확인하십시오.

Apache 버전을 보는 방법 Apache 버전을 보는 방법 Apr 13, 2025 pm 01:15 PM

APACHE 서버에서 버전을 보는 3 가지 방법이 있습니다. 명령 줄 (APACHECTL -V 또는 APACHE2CTL -V)을 통해 서버 상태 페이지 (http : // & lt; 서버 IP 또는 도메인 이름 & gt;/server -status)를 확인하거나 APACHE 구성 파일 (ServerVersion : Apache/& lt; 버전 번호 & gt;).

Debian이 Hadoop 데이터 처리 속도를 향상시키는 방법 Debian이 Hadoop 데이터 처리 속도를 향상시키는 방법 Apr 13, 2025 am 11:54 AM

이 기사에서는 데비안 시스템에서 Hadoop 데이터 처리 효율성을 향상시키는 방법에 대해 설명합니다. 최적화 전략에는 하드웨어 업그레이드, 운영 체제 매개 변수 조정, Hadoop 구성 수정 및 효율적인 알고리즘 및 도구 사용이 포함됩니다. 1. 하드웨어 리소스 강화는 모든 노드에 일관된 하드웨어 구성, 특히 CPU, 메모리 및 네트워크 장비 성능에주의를 기울일 수 있도록합니다. 전반적인 처리 속도를 향상시키기 위해서는 고성능 하드웨어 구성 요소를 선택하는 것이 필수적입니다. 2. 운영 체제 조정 파일 설명 자 및 네트워크 연결 : /etc/security/limits.conf 파일을 수정하여 파일 설명자의 상한을 늘리고 동시에 시스템에 의해 열 수 있습니다. JVM 매개 변수 조정 : Hadoop-env.sh 파일에서 조정

Apache의 Zend를 구성하는 방법 Apache의 Zend를 구성하는 방법 Apr 13, 2025 pm 12:57 PM

Apache에서 Zend를 구성하는 방법은 무엇입니까? Apache 웹 서버에서 Zend 프레임 워크를 구성하는 단계는 다음과 같습니다. Zend 프레임 워크를 설치하고 웹 서버 디렉토리로 추출하십시오. .htaccess 파일을 만듭니다. Zend 응용 프로그램 디렉토리를 작성하고 Index.php 파일을 추가하십시오. Zend 응용 프로그램 (application.ini)을 구성하십시오. Apache 웹 서버를 다시 시작하십시오.

See all articles