CMarkup读取xml文件简单使用

Posted 冥天笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMarkup读取xml文件简单使用相关的知识,希望对你有一定的参考价值。

 class CClassXmlGet
 
 public:
     CClassXmlGet(void);
     ~CClassXmlGet();
     /***********************************/
     bool InitXmlInfo(std::string strLoadPath);
     std::string GetUserName();
     std::string GetPassWord();
 private:
     std::map<std::string,std::string>m_mapXml;
     std::string m_strUserName;
     std::string m_strPassWord;
 ;
 #include "ClassXmlGet.h"
 #include "Markup.h"
 
 CClassXmlGet::CClassXmlGet(void)
 
     m_mapXml.clear();
     m_strUserName = "";
     m_strPassWord = "";
 
 CClassXmlGet::~CClassXmlGet()
 
     m_mapXml.clear();
     m_strUserName = "";
     m_strPassWord = "";
 
 
 bool CClassXmlGet::InitXmlInfo(std::string strLoadPath)
 
     std::string strTempPath = strLoadPath + "conf/config_item.xml";//具体的文件路径+文件名
     CMarkup initXML;
     if (!initXML.Load(strTempPath.c_str()))
         return false;
     
     if (!initXML.FindElem("config") || !initXML.IntoElem())
         return false;
     
     while(initXML.FindElem("item"))
         std::string strkey = initXML.GetAttrib("key");
         std::string strvalue = initXML.GetAttrib("value");
         m_mapXml[strkey] = strvalue;
     
     return true;
 
 std::string CClassXmlGet::GetUserName()
 
     if(!m_strUserName.empty())
         return m_strUserName;
 
     std::map<std::string,std::string>::const_iterator constItor = m_mapXml.find("ServerUserName");
     if(constItor != m_mapXml.end())
         m_strUserName = constItor->second;
 
     return m_strUserName;
 
 std::string CClassXmlGet::GetPassWord()
 
     if(!m_strPassWord.empty())
         return m_strPassWord;
 
     std::map<std::string,std::string>::const_iterator constItor = m_mapXml.find("ServerPass");
     if(constItor != m_mapXml.end())
         m_strPassWord = constItor->second;
 
     return m_strPassWord;
 

具体的xml文档结构

 <?xml version="1.0" encoding="UTF-8" ?>
 <config>
     <item key="ServerPass" value="12345">
         <cap id="Test1" />
     </item>
     <item key="ServerUserName"  value="admin">
         <cap id="test2" />
     </item>
 </config>

核心思想:

当遇到的xml文件节点名称都一样,例如都是item作为节点名称,不同的是item节点中包含的内容不一样时,可以采取将全部节点内容读出来,放到一个map表中,根据map表中的key值进行获取

在 Java 应用程序中读取 XML 文件的最佳/最简单方法是啥? [关闭]

【中文标题】在 Java 应用程序中读取 XML 文件的最佳/最简单方法是啥? [关闭]【英文标题】:What is the best/simplest way to read in an XML file in Java application? [closed]在 Java 应用程序中读取 XML 文件的最佳/最简单方法是什么? [关闭] 【发布时间】:2010-09-30 11:53:00 【问题描述】:

目前,我们的 Java 应用程序使用制表符分隔的 *.cfg 文件中保存的值。我们需要更改此应用程序,使其现在使用 XML 文件。

为了从这个文件中读取值,最好/最简单的库是什么?

【问题讨论】:

【参考方案1】:

根据您的需要,当然有很多好的解决方案。如果只是配置,你应该看看 Jakarta commons-configuration 和 commons-digester。

您总是可以使用标准的 JDK 方法来获取文档:

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

[...]

File file = new File("some/path");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(file);

【讨论】:

同意。这是我阅读小型 XML 文件(如配置文件)的首选方式。与 XPath 结合使用,让您的配置参数的提取变得不那么繁琐。 你没有展示如何阅读属性和上下文。 :( 将功能安全处理设置为 true 以避免 XXE 攻击:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);【参考方案2】:

XML 代码:

<?xml version="1.0"?>
<company>
    <staff id="1001">
        <firstname>yong</firstname>
        <lastname>mook kim</lastname>
        <nickname>mkyong</nickname>
        <salary>100000</salary>
    </staff>
    <staff id="2001">
        <firstname>low</firstname>
        <lastname>yin fong</lastname>
        <nickname>fong fong</nickname>
        <salary>200000</salary>
    </staff>
</company>

Java 代码:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class ReadXMLFile 

  public static void main(String argv[]) 
    try 
    File fXmlFile = new File("/Users/mkyong/staff.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(fXmlFile);
    doc.getDocumentElement().normalize();

    System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
    NodeList nList = doc.getElementsByTagName("staff");
    System.out.println("----------------------------");

    for (int temp = 0; temp < nList.getLength(); temp++) 
        Node nNode = nList.item(temp);
        System.out.println("\nCurrent Element :" + nNode.getNodeName());
        if (nNode.getNodeType() == Node.ELEMENT_NODE) 
            Element eElement = (Element) nNode;
            System.out.println("Staff id : "
                               + eElement.getAttribute("id"));
            System.out.println("First Name : "
                               + eElement.getElementsByTagName("firstname")
                                 .item(0).getTextContent());
            System.out.println("Last Name : "
                               + eElement.getElementsByTagName("lastname")
                                 .item(0).getTextContent());
            System.out.println("Nick Name : "
                               + eElement.getElementsByTagName("nickname")
                                 .item(0).getTextContent());
            System.out.println("Salary : "
                               + eElement.getElementsByTagName("salary")
                                 .item(0).getTextContent());
        
    
     catch (Exception e) 
    e.printStackTrace();
    
  

输出:

----------------

Root element :company
----------------------------

Current Element :staff
Staff id : 1001
First Name : yong
Last Name : mook kim
Nick Name : mkyong
Salary : 100000

Current Element :staff
Staff id : 2001
First Name : low
Last Name : yin fong
Nick Name : fong fong
Salary : 200000

我推荐你阅读这个:Normalization in DOM parsing with java - how does it work?

Example source.

【讨论】:

我会说这是最好的方法,您可以更好地控制转换以及如何构建对象,我尝试了 dom4j 但它失败了,因为客户端发送了一个意外的命名空间,我被告知之前我们可能会在 xml 请求中发送一些意想不到的字段或节点。 +1 用于实际展示如何读取数据...最佳答案没有。 下次我将使用 JAXB 我知道这已经过时了,但是天哪,与在 C# 中读取 XML 文件相比,这很痛苦。这真的是用 Java 读取 XML 数据的最佳方式吗? 这绝对不是最好的办法【参考方案3】:

您选择 XML 配置文件有什么特别的原因吗?我过去做过 XML 配置,但结果往往比其他任何事情都更令人头疼。

我想真正的问题是使用类似 Preferences API 的东西在你的情况下是否会更好。

使用 Preferences API 而不是自己滚动的 XML 解决方案的原因:

避免典型的 XML 丑陋(DocumentFactory 等),同时避免使用 3rd 方库来提供 XML 后端

内置支持默认值(对丢失/损坏/无效条目无需特殊处理)

无需为 XML 存储(CDATA 包装等)清理值

保证后备存储状态(无需不断将 XML 写入磁盘)

后备存储可配置(磁盘上的文件、LDAP 等)

多线程免费访问所有首选项

【讨论】:

preferences api 有 xml 输出 ;) java.sun.com/javase/6/docs/api/java/util/prefs/Preferences.html【参考方案4】:

什么是最好/最简单的库 用于从 这个文件?

当您要求最简单 库时,我觉得有必要添加一种与Guillaume's top-voted answer 中的方法完全不同的方法。 (在其他答案中,sjbotha 提到的 JDOM 最接近我的建议)。

我开始认为,对于 Java 中的 XML 处理,使用标准的 JDK 工具肯定不是最简单的方法,而且仅在某些情况下(例如无法使用 3rd党图书馆,出于某种原因)这是最好的方法。

相反,请考虑使用良好的 XML 库,例如 XOM。以下是如何将 XML 文件读入 nu.xom.Document 对象:

import nu.xom.Builder;
import nu.xom.Document;
import java.io.File;

[...]

File file = new File("some/path");
Document document = new Builder().build(file);

所以,这有点简单,因为在“纯 JDK”方法中,将文件读入 org.w3c.dom.Document 也不是很复杂。但是使用一个好的库的好处才从这里开始!无论您使用 XML 做什么,当使用像 XOM 这样的库时,您通常会得到更简单的解决方案,并且您需要维护的代码更少。例如,考虑this 与this,或this 与this,或this post containing both XOM and W3C DOM examples。

其他人将提供反驳论点 (like these) 说明为什么坚持 Java 的标准 XML API 可能是值得的 - 这些可能有优点,至少在某些情况下,尽管我个人并不订阅所有这些。无论如何,在选择一种或另一种方式时,最好了解故事的两面。

(这个答案是我对 XOM 的评价的一部分,它是我的quest for finding the best Java XML library to replace dom4j 中的有力竞争者。)

【讨论】:

哦,我同意那些指出 XML 可能不一定是这里最好的选择的人的观点,但是出于这个答案的目的,我假设 XML /is/ used【参考方案5】:

JAXB 使用简单,包含在 Java 6 SE 中。使用 JAXB 或其他 XML 数据绑定(如 Simple),您不必自己处理 XML,大部分工作由库完成。基本用法是给你现有的 POJO 添加注解。然后,这些注释用于为您的数据生成 XML Schema,并在从/向文件读取/写入数据时使用。

【讨论】:

【参考方案6】:

查看JAXB。

【讨论】:

【参考方案7】:

我只使用过 jdom。这很容易。

前往此处获取文档并下载:http://www.jdom.org/

如果您有一个非常大的文档,那么最好不要将其全部读入内存,而是使用 SAX 解析器,它会在遇到某些标签和属性时调用您的方法。然后,您必须创建一个状态机来处理传入呼叫。

【讨论】:

【参考方案8】:

目前最简单的是 Simple http://simple.sourceforge.net,你只需要像这样注释一个对象

@Root
public class Entry 

   @Attribute
   private String a
   @Attribute
   private int b;
   @Element
   private Date c;

   public String getSomething() 
      return a;
   
 

@Root
public class Configuration 

   @ElementList(inline=true)
   private List<Entry> entries;

   public List<Entry> getEntries()  
      return entries;
   

然后,您要读取整个文件,只需指定位置,它将解析并填充带注释的 POJO。这将完成所有类型转换和验证。如果需要,您还可以注释持久回调。可以这样读取。

Serializer serializer = new Persister();
Configuration configuraiton = serializer.read(Configuration.class, fileLocation);

【讨论】:

使用 xstream,您无需注释任何内容... 要定制您需要描述的 XML 模式,注释是一种非常有效的方法。 JAXB、C# XML 序列化,甚至 XStream 都利用注释来做到这一点。我们这里不是在讨论序列化,而是在讨论映射到对象的结构化 XML 模式。【参考方案9】:

根据您的应用程序和 cfg 文件的范围,属性文件可能是最简单的。当然它不像 xml 那样优雅,但它肯定更容易。

【讨论】:

【参考方案10】:

使用java.beans.XMLDecoder,自 1.4 起成为核心 Java SE 的一部分。

XMLDecoder input = new XMLDecoder(new FileInputStream("some/path.xml"));
MyConfig config = (MyConfig) input.readObject();
input.close();

write the configuration files by hand 很容易,或者使用相应的XMLEncoder 并通过一些设置在运行时写入新对象。

【讨论】:

【参考方案11】:

这是我使用的。 http://marketmovers.blogspot.com/2014/02/the-easy-way-to-read-xml-in-java.html 它位于标准 JDK 工具之上,因此如果缺少某些功能,您始终可以使用 JDK 版本。

这对我来说真的让事情变得更容易了。当我阅读由旧版本软件保存或由用户手动编辑的配置文件时,这尤其好。它非常健壮,如果某些数据与您期望的格式不完全一致,也不会抛出异常。

【讨论】:

【参考方案12】:

这是我创建的一个非常简单的 API,用于在 Java 中读取简单的 XML 文件。它非常简单易用。希望对你有用。

http://argonrain.wordpress.com/2009/10/27/000/

【讨论】:

以上是关于CMarkup读取xml文件简单使用的主要内容,如果未能解决你的问题,请参考以下文章

DuiLib 源码分析之解析xml类CMarkup & CMarkupNode cpp文件

QT CMarkUp(XMLParser) 错误。 iconv.h:没有这样的文件或目录

在 Java 应用程序中读取 XML 文件的最佳/最简单方法是啥? [关闭]

XML 解析 - 读取一个简单的 XML 文件并检索值

c解析xml文件

C# 如何读取xml文件并输出信息到label上