찾다
백엔드 개발XML/RSS 튜토리얼Android 개발에서 발생하는 두 가지 XML 병합 문제의 예에 대한 자세한 설명

方法一Dom4J处理XML

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
 
 * 合并并输出2个xml文档,所需要jar:dom4j-1.6.1.jar,jaxen-1.1.1.jar
 * 将某个xml文档的某个标签下或该标签上一级下所有内容插入到另一个xml文档的某个标签下
 * @date 2011-04-13
 * @author RobotJi
 * @version 1.0

 public class UniteXML {
 
 public UniteXML() {}
 
   * 根据is获取doc,这里的is可以是本地流或者网络流
  * @param is
  * @return
  
 public static Document getDocument(InputStream is){
  Document doc=null;
   try {
    doc=new SAXReader().read(is);
   } catch (DocumentException e) {
    e.printStackTrace();
   }
  
  return doc;
 }
 public static InputStream getInputStream(String path){
  File f=new File(path);
  if(!f.exists()){
   return null;
  }
  InputStream is=null;
  try {
   is = new FileInputStream(f);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
  return is;
 }
 
 
  * 获取子Element
  * @param doc 要获取的文档
  * @param tagName 文档对应的标签
  * @return
  
 public Element getSubElement(Document doc,String tagName){
  Element el=(Element)doc.selectSingleNode("//"+tagName);
  return el;
 }
 
 
  * 输出xml文档
  * @param doc 要输出的文档
  * @param fileName 路径
  
 public void writeXML(Document doc,String fileName){
  try {
   XMLWriter writer=new XMLWriter(new FileWriter(fileName));
   writer.write(doc);
   writer.flush();
   writer.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 
  * 合并doc
  * @param path1 主文档
  * @param path2 被合并的文档
  * @param tagName1 在主文档中要插入的标签
  * @param tagName2 被合并文档的标签
  * @param isContain 是否包含被合并文档标签的上一级标签下的所有结点
  * @return
  
 public Document unitXMl(String path1,String path2,String tagName1,String tagName2,boolean isContain){
  Document doc1=getDocument(getInputStream(path1));
  Document doc2=getDocument(getInputStream(path2));
    
  Element elSub2=getSubElement(doc2,tagName2);
  Element elSub1=getSubElement(doc1,tagName1);
  
  if(isContain){
//   doc1.getRootElement().appendContent(elSub2.getParent());//直接插入的根标签下
   elSub1.appendContent(elSub2.getParent());//插入到tagName1标签下
  }else{
//   doc1.getRootElement().appendContent(elSub2);
   elSub1.appendContent(elSub2);
  }
  return doc1;
 }
 
 public static void main(String[] args) {
  UniteXML ux=new UniteXML();
//将c标签下所有内容插入到aa标签下,若参数设为true则可将c标签上一级下的所有内容插入到aa标签下
  Document doc=ux.unitXMl("F:\\test\\a.xml", "F:\\test\\b.xml", "aa", "c", false);
    ux.writeXML(doc, "F:\\test\\a_test.xml");
 }
}

//测试用的2个xml如下:

a.xml

Android 개발에서 발생하는 두 가지 XML 병합 문제의 예에 대한 자세한 설명


方法二:

import java.io. *; //Java基础包,包含各种IO操作   
import java.util. *; //Java基础包,包含各种标准数据结构操作   
import javax.xml.parsers. *; //XML解析器接口   
import org.w3c.dom. *; //XML的DOM实现   
import javax.xml.transform. *;  
import javax.xml.transform.dom. *;  
import javax.xml.transform.stream. *;  
  
/** 
 * XML文件合并工具类 
 
 * @author GhostFromHeaven 
 */  
public class XMLMergeUtil {  
      
    /** 
     * XML文件的合并处理 
     * @param mainFileName 待合并处理的xml文件,合并后将更新此文件 
     * @param subFilename 被合并的xml文件 
     * @return 合并成功返回true,否则返回false 
     * @throws Exception 
     */  
    public static boolean isMerging(String mainFileName, String subFilename)  
            throws Exception {  
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
        DocumentBuilder db = null;  
        try {  
            db = dbf.newDocumentBuilder();  
        } catch (ParserConfigurationException pce) {  
            System.err.println(pce); // 出现异常时,输出异常信息  
        }  
        Document doc_main = null;  
        Document doc_vice = null;  
        // 获取两个XML文件的Document  
        try {  
            doc_main = db.parse(mainFileName);  
            doc_vice = db.parse(subFilename);  
        } catch (DOMException dom) {  
            System.err.println(dom.getMessage());  
        } catch (Exception ioe) {  
            System.err.println(ioe);  
        }  
        // 获取两个文件的根节点  
          
        Element root_main = doc_main.getDocumentElement();  
        Element root_vice = doc_vice.getDocumentElement();  
        // 下面添加被合并文件根节点下的每个节点  
        NodeList messageItems = root_vice.getChildNodes();  
        int item_number = messageItems.getLength();  
        // 如果去掉根节点下的第一个节点,那么i从3开始,否则i从1开始  
        for (int i = 1; i < item_number; i = i + 2) {  
            // 调用dupliate(),依次复制被合并XML文档中根节点下的节点  
            Element messageItem = (Element) messageItems.item(i);  
            dupliate(doc_main, root_main, messageItem);  
        }  
        // 调用 write To(),将合并得到的Document写入目标XML文档  
        boolean isWritten = writeTo(doc_main, mainFileName);  
        return isWritten;  
    }  
      
    /** 
     * 
     * @param doc_dup 
     * @param father 
     * @param son 
     * @return 
     * @throws Exception 
     */  
    private static boolean dupliate(Document doc_dup, Element father, Element son)  
            throws Exception {  
        boolean isdone = false;  
        Element parentElement = null;  
          
        DuplicateChildElementObject childElementObject = isChildElement(father, son);  
        if(!childElementObject.isNeedDuplicate()){  
            //节点相同不用合并  
            isdone = true;  
            parentElement = childElementObject.getElement();  
        }else if(childElementObject.getElement() != null){  
            parentElement = childElementObject.getElement();  
        }else{  
            parentElement = father;  
        }  
          
        String son_name = son.getNodeName();  
        Element subITEM = null;  
        if(!isdone){  
            subITEM = doc_dup.createElement(son_name);  
            // 复制节点的属性  
            if (son.hasAttributes()) {  
                NamedNodeMap attributes = son.getAttributes();  
                for (int i = 0; i < attributes.getLength(); i++) {  
                    String attribute_name = attributes.item(i).getNodeName();  
                    String attribute_value = attributes.item(i).getNodeValue();  
                    subITEM.setAttribute(attribute_name, attribute_value);  
                }  
            }  
            parentElement.appendChild(subITEM);  
        }  
        else{  
            subITEM = parentElement;  
        }  
          
        // 复制子结点  
        NodeList sub_messageItems = son.getChildNodes();  
        int sub_item_number = sub_messageItems.getLength();  
        if (sub_item_number < 2) {  
            // 如果没有子节点,则返回  
            isdone = true;  
        } else {  
            for (int j = 1; j < sub_item_number; j = j + 2) {  
                // 如果有子节点,则递归调用本方法  
                Element sub_messageItem = (Element) sub_messageItems.item(j);  
                isdone = dupliate(doc_dup, subITEM, sub_messageItem);  
            }  
        }  
          
          
        return isdone;  
    }  
  
    private static boolean writeTo(Document doc, String fileName) throws Exception {  
        boolean isOver = false;  
        DOMSource doms = new DOMSource(doc);  
        File f = new File(fileName);  
        StreamResult sr = new StreamResult(f);  
        try {  
            TransformerFactory tf = TransformerFactory.newInstance();  
            Transformer t = tf.newTransformer();  
            Properties properties = t.getOutputProperties();  
            properties.setProperty(OutputKeys.ENCODING, "UTF-8");  
            t.setOutputProperties(properties);  
            t.transform(doms, sr);  
            isOver = true;  
        } catch (TransformerConfigurationException tce) {  
            tce.printStackTrace();  
        } catch (TransformerException te) {  
            te.printStackTrace();  
        }  
        return isOver;  
    }  
      
    private static DuplicateChildElementObject isChildElement(Element father, Element son){  
          
        DuplicateChildElementObject  childElementObject = new DuplicateChildElementObject();  
          
        NodeList messageItems = father.getChildNodes();  
        int item_number = messageItems.getLength();  
        //首先遍历所有节点,查找是否有完全相同的节点,防止同一节点已定义多次  
        for (int i = 1; i < item_number; i = i + 2) {  
            Element messageItem = (Element) messageItems.item(i);  
            if(!messageItem.getNodeName().equals(son.getNodeName())){  
                continue;  
            }  
            if(messageItem.isEqualNode(son)){//同时判断子节点是否一致  
                childElementObject.setNeedDuplicate(false);  
                childElementObject.setElement(messageItem);  
                return childElementObject;  
            }  
        }  
        for (int i = 1; i < item_number; i = i + 2) {  
            Element messageItem = (Element) messageItems.item(i);  
            //判断节点是否处于同一级别  
            if(!messageItem.getNodeName().equals(son.getNodeName())){  
                continue;  
            }  
            if(isEqualNode(messageItem,son)){//仅判断当前节点是否一致  
                if(hasEqualAttributes(messageItem,son)){//当前节点完全相同不需要合并  
                    childElementObject.setNeedDuplicate(false);  
                    childElementObject.setElement(messageItem);  
                    return childElementObject;  
                }else{//当前节点的属性不相同,需要合并  
                    childElementObject.setNeedDuplicate(true);  
                    childElementObject.setElement(father);  
                    return childElementObject;  
                }  
            }      
        }  
        //目标文档该节点不存在,需要合并到目标文档中  
        childElementObject.setNeedDuplicate(true);  
        childElementObject.setElement(father);  
        return childElementObject;  
    }  
      
    /** 
     * 判断两个节点是否相同,未判断节点的属性 
     * @param arg0 
     * @param arg 
     * @return 
     */  
    private static boolean isEqualNode(Node arg0,Node arg) {  
        if (arg == arg0) {  
            return true;  
        }  
        if (arg.getNodeType() != arg0.getNodeType()) {  
            return false;  
        }  
  
        if (arg0.getNodeName() == null) {  
            if (arg.getNodeName() != null) {  
                return false;  
            }  
        } else if (!arg0.getNodeName().equals(arg.getNodeName())) {  
            return false;  
        }  
  
        if (arg0.getLocalName() == null) {  
            if (arg.getLocalName() != null) {  
                return false;  
            }  
        } else if (!arg0.getLocalName().equals(arg.getLocalName())) {  
            return false;  
        }  
  
        if (arg0.getNamespaceURI() == null) {  
            if (arg.getNamespaceURI() != null) {  
                return false;  
            }  
        } else if (!arg0.getNamespaceURI().equals(arg.getNamespaceURI())) {  
            return false;  
        }  
  
        if (arg0.getPrefix() == null) {  
            if (arg.getPrefix() != null) {  
                return false;  
            }  
        } else if (!arg0.getPrefix().equals(arg.getPrefix())) {  
            return false;  
        }  
  
        if (arg0.getNodeValue() == null) {  
            if (arg.getNodeValue() != null) {  
                return false;  
            }  
        } else if (!arg0.getNodeValue().equals(arg.getNodeValue())) {  
            return false;  
        }  
        return true;  
    }  
      
    /** 
     * 判断节点的属性是否相同 
     * @param arg0 
     * @param arg 
     * @return 
     */  
    private static boolean hasEqualAttributes(Node arg0,Node arg) {  
          
        NamedNodeMap map1 = arg0.getAttributes();  
        NamedNodeMap map2 = arg.getAttributes();  
        int len = map1.getLength();  
        if (len != map2.getLength()) {  
            return false;  
        }  
          
         for (int i = 0; i < len; i++) {  
             Node n1 = map1.item(i);  
             if(n1.getNodeName() != null){  
                  Node n2 = map2.getNamedItem(n1.getNodeName());  
                  if(n2 == null){  
                      return false;  
                  }else if(!n1.getNodeValue().equals(n2.getNodeValue())){  
                      return false;  
                  }  
             }  
         }  
         return true;  
    }  
    public static void main(String[] args) {  
        try {  
  
            String sourcefile = "d:/a.xml";   
            String targetfile = "d:/b.xml";  
              
            boolean isdone = XMLMergeUtil.isMerging(sourcefile, targetfile);  
              
            if (isdone)  
                System.out.println("XML files have been merged.");  
            else  
                System.out.println("XML files have NOT been merged.");  
          
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  
  
/** 
 * 复制子节点对象 
 * @author Administrator 
 * 
 */  
class DuplicateChildElementObject{  
    private boolean needDuplicate = true;//记录该节点是否需要复制  
    private Element element = null;//记录该节点的父节点  
  
    public DuplicateChildElementObject() {  
        super();  
    }  
  
    public boolean isNeedDuplicate() {  
        return needDuplicate;  
    }  
  
    public void setNeedDuplicate(boolean needDuplicate) {  
        this.needDuplicate = needDuplicate;  
    }  
  
    public Element getElement() {  
        return element;  
    }  
  
    public void setElement(Element element) {  
        this.element = element;  
    }  
}

위 내용은 Android 개발에서 발생하는 두 가지 XML 병합 문제의 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

RSS 문서는 XML 파일을 통해 컨텐츠 업데이트를 게시하는 간단한 구독 메커니즘입니다. 1. RSS 문서 구조는 여러 요소로 구성되며 요소를 포함합니다. 2. RSS 리더를 사용하여 XML을 구문 분석하여 채널을 구독하고 정보를 추출하십시오. 3. 고급 사용에는 FeedParser 라이브러리를 사용한 필터링 및 정렬이 포함됩니다. 4. 일반적인 오류에는 XML 구문 분석 및 인코딩 문제가 포함됩니다. XML 형식 및 인코딩은 디버깅 중에 확인해야합니다. 5. 성능 최적화 제안에는 캐시 RSS 문서 및 비동기 구문 분석이 포함됩니다.

RSS, XML 및 최신 웹 : 콘텐츠 신디케이션 깊은 다이빙RSS, XML 및 최신 웹 : 콘텐츠 신디케이션 깊은 다이빙May 08, 2025 am 12:14 AM

RSS와 XML은 여전히 ​​최신 웹에서 중요합니다. 1.RSS는 콘텐츠를 게시하고 배포하는 데 사용되며 사용자는 RSS 리더를 통해 구독하고 업데이트를받을 수 있습니다. 2. XML은 마크 업 언어이며 데이터 저장 및 교환을 지원하며 RSS 파일은 XML을 기반으로합니다.

Beyond Basic : XML이 활성화 한 고급 RSS 기능Beyond Basic : XML이 활성화 한 고급 RSS 기능May 07, 2025 am 12:12 AM

RSS를 사용하면 멀티미디어 컨텐츠 임베딩, 조건부 가입 및 성능 및 보안 최적화가 가능합니다. 1) 태그를 통해 오디오 및 비디오와 같은 멀티미디어 컨텐츠를 포함합니다. 2) XML 네임 스페이스를 사용하여 조건부 가입을 구현하여 구독자가 특정 조건에 따라 컨텐츠를 필터링 할 수 있습니다. 3) CDATA 섹션 및 XMLSCHEMA를 통해 RSSFEED의 성능 및 보안을 최적화하여 표준에 대한 안정성과 준수를 보장합니다.

RSS 디코딩 : 웹 개발자를위한 XML 프라이머RSS 디코딩 : 웹 개발자를위한 XML 프라이머May 06, 2025 am 12:05 AM

RSS는 자주 업데이트되는 데이터를 게시하는 데 사용되는 XML 기반 형식입니다. 웹 개발자로서 RSS를 이해하면 콘텐츠 집계 및 자동화 업데이트 기능을 향상시킬 수 있습니다. RSS 구조, 구문 분석 및 생성 방법을 학습하면 RSSFeeds를 자신있게 처리하고 웹 개발 기술을 최적화 할 수 있습니다.

JSON 대 XML : RSS가 XML을 선택한 이유JSON 대 XML : RSS가 XML을 선택한 이유May 05, 2025 am 12:01 AM

RSS는 다음과 같이 JSON 대신 XML을 선택했습니다. 1) XML의 구조 및 검증 기능은 JSON보다 낫습니다. 이는 RSS 복잡한 데이터 구조의 요구에 적합합니다. 2) XML은 당시 광범위하게 지원되었다. 3) RSS의 초기 버전은 XML을 기반으로했으며 표준이되었습니다.

RSS : XML 기반 형식이 설명되었습니다RSS : XML 기반 형식이 설명되었습니다May 04, 2025 am 12:05 AM

RSS는 자주 업데이트되는 컨텐츠를 구독하고 읽는 데 사용되는 XML 기반 형식입니다. 작업 원칙에는 생성과 소비, RSS 리더 사용을 사용하면 정보를 효율적으로 얻을 수 있습니다.

RSS 문서 내부 : 필수 XML 태그 및 속성RSS 문서 내부 : 필수 XML 태그 및 속성May 03, 2025 am 12:12 AM

RSS 문서의 핵심 구조에는 XML 태그 및 속성이 포함됩니다. 특정 구문 분석 및 생성 단계는 다음과 같습니다. 1. XML 파일, 프로세스 및 태그 읽기. 2. 추출 ,, 등을 태그 정보. 3. 버전 호환성을 보장하기 위해 사용자 정의 태그 및 속성을 처리하십시오. 4. 캐시 및 비동기 처리를 사용하여 성능을 최적화하여 코드 가독성을 보장하십시오.

JSON, XML 및 데이터 형식 : RSS 비교JSON, XML 및 데이터 형식 : RSS 비교May 02, 2025 am 12:20 AM

JSON, XML 및 RSS의 주요 차이점은 구조와 2. XML은 엄격하지만 복잡한 구문 분석을 가진 복잡한 데이터 구조에 적합합니다. 3. RSS는 XML을 기반으로하며 컨텐츠 릴리스, 표준화되었지만 제한된 사용에 사용됩니다.

See all articles

핫 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 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.