out = new FileOutputStream(file);
            XMLOutputter serializer = new XMLOutputter();

            // jdom output format
            Format f = Format.getPrettyFormat(); // output 출력 포맷 - pretty format : whitespace beautification with 2-space indents, uses the UTF-8 encoding 등
            serializer.setFormat(f);

            serializer.output(xmlDoc, out);
            out.flush();


http://www.jdom.org/docs/apidocs/index.html

http://applejara.tistory.com/entry/%EC%97%90%EB%9F%ACThe-processing-instruction-target-matching-xXmMlL-is-not-allowed

위 링크의 내용을 참고했습니다.
아래는 자료 보존용입니다.


심각: Parse Fatal Error at line 10 column 6: The processing instruction target m
atching "[xX][mM][lL]" is not allowed.

org.xml.sax.SAXParseException: The processing instruction target matching "[xX][
mM][lL]" is not allowed.


이런 에러를 발생했습니다.
이것은  아래처럼 xml을 선언해 주실때


1. 공백(whitespace) 있거나

   <?xml version='1.0' encoding='utf-8'?>

2. 주석이 있거나

<!-- xml 시작 -->
<?xml version='1.0' encoding='utf-8'?> 
하면 생기는 오류입니다.


xml의 선언부는 항상 문서의 제일 먼저 와야 합니다.

참고: http://www.yunsobi.com/tt/subby/99
참고: http://decoder.tistory.com/37

첨부된 파일은 검색에서 나온 것으로 문제 있으면 삭제하겠습니다.

package com.omp.bp.cms.batchreg.service;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

import com.omp.bp.cms.batchreg.BatchRegisterErrorConstants;
import com.omp.bp.cms.util.DateUtil;

/**
 * 배치 등록 관련 에러 로그 처리 클래스. 콘텐츠 하나에 대한 에러로그XML 생성.
 * @author Sung,HongJe
 *
 */
public class BatchRegisterError {

    private final static Logger log = Logger.getLogger(BatchRegisterError.class);

    private final String ERROR_FILE_NAME_HEADER = "ERROR_";
    private final String ERROR_FILE_EXT = "XML";

    /**
     * 에러 로그 파일 생성
     * @param ftpRepoPath ftp 디렉토리 패스
     * @param contentId 콘텐츠ID
     * @param contentType 콘텐츠타입 - C:채널, E:콘텐츠(에피소드)
     * @param errorCode 에러코드
     * @throws IOException
     */
    public void makeErrorLog(String ftpRepoPath, String contentId, String contentType, int errorCode) throws IOException {

        // 1. ERROR 파일패스 설정 : ftpRepo/ERROR_[TYPE]_[CID].XML
        // 2. 에러 코드를 이용해서 XML 내용 설정
        // 3. 파일로 저장

        // ftpRepo/ERROR_C_000050151.XML
        String filePath = ftpRepoPath + File.separator + ERROR_FILE_NAME_HEADER + contentType.toUpperCase() + "_" + contentId + "." + ERROR_FILE_EXT;
        String errorMsg = BatchRegisterErrorConstants.getErrorMsg(errorCode);

        // XML 내용 생성
        Document xmlDoc = makeErrorXML(contentId, errorCode, errorMsg, DateUtil.getToday() + DateUtil.getTime());

        File file = new File(filePath);
        FileOutputStream out = null;

        try {

            if(!file.exists()) { // 로그 파일 없으면 생성

                File dir = new File(ftpRepoPath); // ftp 디렉토리가 없으면 생성
                if(!dir.exists())
                    dir.mkdir();

                file.createNewFile();
            }

            out = new FileOutputStream(file);
            XMLOutputter serializer = new XMLOutputter();
            serializer.output(xmlDoc, out);
            out.flush();
        }
        catch (IOException e) {

            log.error("BatchRegisterError.makeErrorLog 로그 파일 작성 중 예외 발생", e);
            throw e;
        }
        finally {

            if(out != null) {

                try {

                    out.close();
                }
                catch (IOException e) {

                    log.error("BatchRegisterError.makeErrorLog 로그 파일 작성 종료 중 예외 발생", e);
                }
            }
        }
    }

    /**
     * 에러 메시지를 담는 XML을 생성 후 반환
     * @param contentId
     * @param errorCode
     * @param errorMsg
     * @param dateTime
     * @return
     */
    private Document makeErrorXML(String contentId, int errorCode, String errorMsg, String dateTime) {

        Document doc = new Document();

        Element error_log = new Element("error_log"); // root

        Element content_id = new Element("content_id");
        content_id.setAttribute("id", contentId); // set CID

        Element msg = new Element("msg");
        msg.setText(errorMsg);

        Element code = new Element("code");
        code.setText(String.valueOf(errorCode));

        Element time = new Element("time");
        time.setText(DateUtil.getToday() + DateUtil.getTime());

        content_id.addContent(msg);
        content_id.addContent(code);
        content_id.addContent(time);

        error_log.addContent(content_id);

        doc.addContent(error_log);

        return doc;
    }
}


볼드체를 참고하기

[json] org.json.* 사용하기

프로그래밍/ETC 2010. 4. 20. 16:05 Posted by galad
public void testJson() {
        try {
            JSONStringer test1 = new JSONStringer();
            test1
                .object()
                    .key("key")
                    .value("value")
                .endObject();
           
            System.out.println(test1.toString());
           
            JSONStringer test2 = new JSONStringer();
            test2
                .array() // array 시작 [
                    .object() // object 시작 {
                        .key("key")
                        .value("value")
                        .key("key2")
                        .value("value2")
                    .endObject() // object 끝 }
                    .object()
                        .key("2key")
                        .value("2value")
                    .endObject()
                .endArray(); // array 끝 ]
           
            System.out.println(test2.toString());
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

결과는
{"key":"value"}
[{"key":"value","key2":"value2"},{"2key":"2value"}]


참고: http://forums.sun.com/thread.jspa?threadID=5294908

StringReader sr = new StringReader(sb.toString());
InputSource xmlSource = new InputSource(sr);

ret = xpath.evaluate("//GetLASeR/RET", xmlSource); // 여기까지는 가능
ret = xpath.evaluate("//GetLASeR/RET", xmlSource); // 여기서 예외발생 - Stream closed.
evaluate() 실행하면 스트림의 처음부터 끝까지 읽어서 검색하는 듯.
그래서 첫번째를 실행하고 스트림이 닫혔기 때문에, 두번째의 evaluate()에서 예외발생
(스트림이니까 한번 쭉 읽어들이고 나면 다시 처음부분으로는 접근불가?)

검색 원본이 파일일 경우에는 이런 예외가 발생하지 않는데,
// 검색 원본 InputSource 객체 생성 - 검색 원본이 XML문서 파일이므로.
InputSource xmlSource = new InputSource("WebContent/ch13/bml.xml");

System.out.println("--책 아이디로 제목 찾기");
String title = xpath.evaluate("/booklist/book/title[../@id='b2']", xmlSource);
System.out.println(title);
       
System.out.println("--책 아이디로 book 엘리먼트 찾기");
Node nBook = (Node) xpath.evaluate("/booklist/book[@id='b2']", xmlSource, XPathConstants.NODE);
Element eBook = (Element) nBook;
System.out.println(eBook.getAttribute("kind"));
아마도 두번째 evaluate()부터는 다시 파일에서 읽어들여서 처리하는 듯하다.
참고: http://www.stylusstudio.com/xmldev/200210/post10820.html

InputSource xmlSource = new InputSource(new StringReader(sb.toString()));
참고: http://www.psuedoguru.com/roller/page/psuedoblog?entry=failed_to_create_an_xpathfactory

XPathFactory factory = XPathFactory.newInstance();
여기에서 아래와 같은 에러가 나올 때가 있다.

java.lang.RuntimeException: XPathFactory#newInstance() failed to create an XPathFactory for the default object model: http://java.sun.com/jaxp/xpath/dom with the XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationException: No XPathFctory implementation found for the object model: http://java.sun.com/jaxp/xpath/dom

문제는 아래.

Finally found out that the problem was due to the Tomcat Java 1.4 compatibility libraries. I had recently upgraded to Java 1.5, but forgot to remove them.
$TOMCAT_HOME/common/endorsed/xercesImpl.jar
$TOMCAT_HOME/common/endorsed/xml-apis.jar

톰캣의 xml관련 api에서 문제가 밸생한 것임.
파일을 옮기던가 지우던가 하면 해결된다.

06 XML 마지막날.

프로그래밍/ETC 2007. 11. 28. 09:44 Posted by galad

 XML -> 정보 전달 수단, 문서 작성, HTML을 보완(대체가 아니다)


① Well-Formed XML

② Valid XML

  Well-Formed XML + DTD(or Schema)


DTD의 단점

- XML 문법과 다르다.

- 표현할 수 있는 데이터 종류가 적다. 풍부한 표현이 불가.


-> 최근에는 스키마가 많이 쓰이지만, 아직도 혼용되고 있다.


Schema

- 풍부한 표현이 가능. 사용자 정의 타입도 만들 수 있다.


=> DOM, SAX 등의 api를 이용해서 JAVA에서 XML을 다룰 수 있어야 한다.

JSP에서 배움.

'프로그래밍 > ETC' 카테고리의 다른 글

[XPath] String으로 InputSource 생성하기  (0) 2009.03.02
[에러] javax.xml.xpath.XPathFactory 사용 시, newInstance() 생성이 안될 때  (0) 2009.03.02
05 스키마...  (0) 2007.11.28
04 DTD...  (0) 2007.11.28
03 엘리먼트 내용  (0) 2007.11.28

05 스키마...

프로그래밍/ETC 2007. 11. 28. 09:44 Posted by galad

<<< memberlist2.xsd >>>


<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <!-- 주석 -->
    <xsd:annotation>
        <xsd:appinfo source="memberlist2.xml">
            memberlist2.xml
        </xsd:appinfo>
        <xsd:documentation source="memberlist2.xml" xml:lang="ko">
            dtd로 만든 memberlist를 xml schema로 바꾼다.
        </xsd:documentation>
    </xsd:annotation>
   
    <!-- 루트 엘리먼트 선언 -->
    <xsd:element name="MemberList">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Member" type="ctMember" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
   
    <!-- 글로벌 컴플렉스 타입 정의 -->
    <xsd:complexType name="ctMember">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="xsd:int"/>
            <xsd:element name="sex" type="ctSex"/>           
            <xsd:element name="job" type="ctJob"/>
            <xsd:element name="address" type="xsd:string"/>
            <xsd:element name="tel" type="xsd:string"/>
        </xsd:sequence>
       
        <!-- 속성 선언 -->
        <xsd:attribute name="kind" type="stMemberKind" use="required"/>
        <xsd:attribute name="id" type="xsd:ID" use="required"/>
    </xsd:complexType>
   
    <xsd:complexType name="ctJob">
        <xsd:sequence>
            <xsd:element name="company_name" type="xsd:string"/>
            <xsd:element name="company_tel" type="ctCompanyTel"/>
            <xsd:element name="company_address" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
   
    <xsd:complexType name="ctSex">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute name="s" type="stSex" use="required"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
   
    <xsd:complexType name="ctCompanyTel">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute name="com_tel" type="stCompanyTel" use="required"/>
            </xsd:extension>           
        </xsd:simpleContent>
    </xsd:complexType>
   
    <!-- 사용자 정의 심플 타입 정의 -->
    <xsd:simpleType name="stMemberKind">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="유료"/>
            <xsd:enumeration value="무료"/>
        </xsd:restriction>
    </xsd:simpleType>
   
    <xsd:simpleType name="stSex">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="man"/>
            <xsd:enumeration value="woman"/>
        </xsd:restriction>
    </xsd:simpleType>
   
    <xsd:simpleType name="stCompanyTel">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="fax"/>
            <xsd:enumeration value="H.P."/>
            <xsd:enumeration value="tel"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>



<<< memberlist2.xml >>>


<?xml version="1.0" encoding="UTF-8"?>
<MemberList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="memberlist2.xsd">
    <Member kind="무료" id="askjdfkd">
        <name>김종식</name>
        <age>28</age>
        <sex s="woman">여자</sex>
        <job>
            <company_name>itea</company_name>
            <company_tel com_tel="H.P.">001</company_tel>
            <company_address>서소문</company_address>
        </job>
        <address>안산?</address>
        <tel>000</tel>
    </Member>   
</MemberList>

'프로그래밍 > ETC' 카테고리의 다른 글

[에러] javax.xml.xpath.XPathFactory 사용 시, newInstance() 생성이 안될 때  (0) 2009.03.02
06 XML 마지막날.  (0) 2007.11.28
04 DTD...  (0) 2007.11.28
03 엘리먼트 내용  (0) 2007.11.28
02 xml 복습 및 2일째  (0) 2007.11.28

04 DTD...

프로그래밍/ETC 2007. 11. 28. 09:43 Posted by galad

예제


 

<<< memberlist.dtd >>>


<?xml version="1.0" encoding="UTF-8"?>

<!-- 엘리먼트 선언 -->
<!ELEMENT MemberList (Member*)>
    <!ELEMENT Member (name, age, sex, job, address, tel)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        <!ELEMENT sex (#PCDATA)>
        <!ELEMENT job (company_name, company_tel+, company_address)>
            <!ELEMENT company_name (#PCDATA)>
            <!ELEMENT company_tel (#PCDATA)>
            <!ELEMENT company_address (#PCDATA)>
        <!ELEMENT address (#PCDATA)>
        <!ELEMENT tel (#PCDATA)>
       
<!-- 속성 선언 -->
<!ATTLIST Member
    kind (유료|무료) #REQUIRED
    id ID #REQUIRED>
<!ATTLIST sex
    s (man|woman) #REQUIRED>
<!ATTLIST company_tel
    ctel (fax|HP|tel) #REQUIRED>




<<< memberlist.xml >>>


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE MemberList SYSTEM "memberlist.dtd">

<MemberList>
    <Member kind="무료" id="b1">
        <name>성홍제</name>
        <age>27</age>
        <sex s="man">남자</sex>
        <job>
            <company_name>ITEA</company_name>
            <company_tel ctel="tel">000</company_tel>
            <company_address>서소문</company_address>
        </job>
        <address>염리동</address>
        <tel>000</tel>
    </Member>
    <Member kind="유료" id="b2">
        <name>정은진</name>
        <age>25</age>
        <sex s="woman">여자</sex>
        <job>
            <company_name>ITEA</company_name>
            <company_tel ctel="HP">011</company_tel>
            <company_address>서소문</company_address>
        </job>
        <address>화성시</address>
        <tel>001</tel>
    </Member>
    <Member kind="무료" id="b3">
        <name>신석만</name>
        <age>29</age>
        <sex s="man">남자</sex>
        <job>
            <company_name>ITEA</company_name>
            <company_tel ctel="fax">013</company_tel>
            <company_address>서소문</company_address>
        </job>
        <address>서울시</address>
        <tel>012</tel>
    </Member>
    <Member kind="유료" id="b4">
        <name>손영범</name>
        <age>29</age>
        <sex s="man">남자</sex>
        <job>
            <company_name>ITEA</company_name>
            <company_tel ctel="HP">012</company_tel>
            <company_address>서소문</company_address>
        </job>
        <address>대구시</address>
        <tel>002</tel>
    </Member>
</MemberList>

'프로그래밍 > ETC' 카테고리의 다른 글

06 XML 마지막날.  (0) 2007.11.28
05 스키마...  (0) 2007.11.28
03 엘리먼트 내용  (0) 2007.11.28
02 xml 복습 및 2일째  (0) 2007.11.28
01....  (0) 2007.11.28

03 엘리먼트 내용

프로그래밍/ETC 2007. 11. 28. 09:42 Posted by galad
 XML

2006/08/16 10:14

http://blog.naver.com/galad/140027564071

☆ 자식 엘리먼트

엘리먼트의 내용으로 자식 엘리먼트를 포함할 수 있다.




 
☆ 엔티티 참조
자주 쓰이는 내용을 엔티티로 정의하고, XML문서에서 엔티티로 정의된 내용과 동일한 내용이 작성되어야 할 부분에 엔티티 참조를 사용한다.
 
☆ 문자 참조
문자 집합 코드표상에 언급되어 있는 코드값을 직접 사용하여 문자를 나타내는 것이다.
 

 
 
☆ CDATA 섹션
대부분의 문자 데이터인 PCDATA(Parsed Character DATA)는 XML 파서가 해석하는 데이터를 말한다.
CDATA 섹션 내에 정의된 문자 데이터는 XML 프로세서가 해석하지 않고 바로 응용프로그램에게 전달한다.
<![CDATA[문자 데이터]]>
 
 

 

☆ 프로세싱 지시자(Processing Instruction)

☆ 공백 문자열

하나 이상의 공백 문자들로 구성된 문자열

XML 1.0권고안에서는 스페이스(#x20), 탭(#x9), 캐리지 리턴(#xd), 라인피드(#xa)만을 공백 문자로 분류하고 있다.


★ 속성



 
 
★ 주석
<!-- 주석 내용 -->
 
★ 프로세싱 지시자
 

'프로그래밍 > ETC' 카테고리의 다른 글

06 XML 마지막날.  (0) 2007.11.28
05 스키마...  (0) 2007.11.28
04 DTD...  (0) 2007.11.28
02 xml 복습 및 2일째  (0) 2007.11.28
01....  (0) 2007.11.28

02 xml 복습 및 2일째

프로그래밍/ETC 2007. 11. 28. 09:41 Posted by galad

 

 

 
 
★ XML 선언문법
반드시 XML 문서 첫 줄에 기술되어야 한다.
<?xml version="버젼번호" encoding="인코딩방식" standalone="yes|no"?>
 
<? 와 xml 문자 사이에 공백을 두어서는 안 된다.
무조건 맨 첫 줄에 기술되어야 한다. 주석도 불가!
버전 속성은 반드시 있어야 함.
인코딩과 스탠드 얼론은 생략 시, 디폴트 - UTF-8, no 값으로 처리.
스탠드얼론 - parser가 xml문서를 해석할 때 외부 DTD문서 참조 여부
 
★ 엘리먼트
- 모든 xml문서는 단 하나의 루트 엘리먼트를 갖는다
- 엘리먼트는 시작 태그와 끝 태그로 구성되면 태그명은 동일해야 한다.
- 부가적인 정보를 나타내는 속성을 가질 수 있다.
- 시작태그와 끝 내그 사이에는 엘리먼트의 실질적인 내용이 오는데, 문자 데이터 및
 자식 엘리먼트가 올 수 있다.
 

 
 
★ 엘리먼트의 종류
① 내용을 가지는 엘리먼트
- 문자 데이터나 자식 엘리먼트를 내용으로 갖는 엘리먼트
<book>
   <title>자연과 인간</title>
</book>
 
② 내용이 없는 빈 엘리먼트
- 문자 데이터나 자식 엘리먼트를 갖지 않는 엘리먼트
<image src="d:\temp\image1.gif"/>
or
<image src="d:\temp\image1.gif"></image>
 
 

 
 
 

 

 
 
 

 
 
★ 엘리먼트 내용
- 문자 데이터 : XML 프로세서가 해석할 수 있는 내용 중에서 마크업을 제외한 부분
 

 
 
- 문자 데이터 내에는 '&'문자와 '<'문자를 사용할 수 없다. '&'문자는 엔티티 참조의 시작을 의미하며, '<'문자는 엘리먼트의 태그, CDATA 섹션의 시작을 의미하기 때문이다.
- 빌트인 엔티티의 참조 또는 문자 참조로 사용이 가능하다.
 
 

 
 
 

'프로그래밍 > ETC' 카테고리의 다른 글

06 XML 마지막날.  (0) 2007.11.28
05 스키마...  (0) 2007.11.28
04 DTD...  (0) 2007.11.28
03 엘리먼트 내용  (0) 2007.11.28
01....  (0) 2007.11.28

01....

프로그래밍/ETC 2007. 11. 28. 09:40 Posted by galad

<?xml version="1.0" encoding="utf-8"?>


<책목록>
 <책>
  <제목>제길 춥네</제목>
  <저자>lonelycat</저자>
 </책>
</책목록>


저장 시 UTF-8 로 선택해서 저장해야만 익스플로러에서 제대로 보인다.


인코딩이 euc-kr 이면 아스키로..

'프로그래밍 > ETC' 카테고리의 다른 글

06 XML 마지막날.  (0) 2007.11.28
05 스키마...  (0) 2007.11.28
04 DTD...  (0) 2007.11.28
03 엘리먼트 내용  (0) 2007.11.28
02 xml 복습 및 2일째  (0) 2007.11.28