0

私はJavaを使用してURLからRSSフィードを読み取り、を使用してDOMツリーを解析し、javax.xml.parsers.DocumentBuilder.parse(InputStream)それにいくつかの変更を加えてから、を使用して結果をシリアル化して出力していorg.w3c.dom.ls.LSSerializer.write(Node,LSOutput)ます。

私が読んでいるフィードはhttp://www.collaborationblueprint.com.au/blog/rss.xmlです。

フィードは整形式のXMLですが、シリアル化の結果はそうではありません。
これまでのすべての試みで、CDataセクションは1組の角かっこを削除することで壊れています。
たとえば、ソースに次の要素が含まれている場合:

    <description> <![CDATA[<p>一部のテキスト</p>]]> </ description>

シリアル化された結果は次のようになり、整形式ではありません。

    <description> <![CDATA<p>テキスト</p>]> </ description>

私のコードは以下の通りです。LotusDominoエージェントに含まれています。
この問題を解決するにはどうすればよいですか?

import java.io.InputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.util.HashMap;

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

import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;

import lotus.domino.*;

public class JavaAgent extends AgentBase {
    public void NotesMain() {
        try {
            org.w3c.dom.Document newDoc;
            DocumentBuilderFactory builderFactory;
            DocumentBuilder builder;
            Element docElem,tmpElem;
            Node tmpNode;

            Session session=getSession();
            AgentContext agentContext=session.getAgentContext();

            // Put URL arguments into a HashMap.
            Document doc=agentContext.getDocumentContext();
            String[] query=doc.getItemValueString("Query_String").split("&");

            HashMap<String,String> queryMap=new HashMap<String,String>(query.length);
            for (int i=0; i<query.length; i++) {
                int j=query[i].indexOf('=');
                if (j<0) queryMap.put(query[i],"");
                else queryMap.put(query[i].substring(0,j),URLDecoder.decode(query[i].substring(j+1),"UTF-8"));
            }

            // Get the "src" URL argument - this is the URL we're reading the feed from.
            String urlStr=queryMap.get("src");
            if (urlStr==null || urlStr.length()==0) {
                System.err.println("Error: source URL not specified.");
                return;
            }
            URL url;
            try {
                url=new URL(urlStr);
            } catch (Exception e) {
                System.err.println("Error: invalid source URL.");
                return;
            }

            HttpURLConnection conn=(HttpURLConnection)url.openConnection();
            InputStream is=conn.getInputStream();

            builderFactory=DocumentBuilderFactory.newInstance();
            builder=builderFactory.newDocumentBuilder();

            // Create a DocumentBuilder and parse the XML.
            builder=builderFactory.newDocumentBuilder();
            try {
                newDoc=builder.parse(is);
                is.close();
                conn.disconnect();
            } catch (Exception e) {
                is.close();
                conn.disconnect();
                System.err.println("XML parse exception: "+e.toString());
                return;
            }

            docElem=newDoc.getDocumentElement();
            docElem.setAttribute("xmlns:ibmwcm","http://purl.org/net/ibmfeedsvc/wcm/1.0");

            PrintWriter pw=getAgentOutput();
            pw.println("Content-type: text/xml");

            DOMImplementationRegistry registry=DOMImplementationRegistry
                .newInstance();
            DOMImplementationLS impl=(DOMImplementationLS)registry
                .getDOMImplementation("LS");
            LSOutput lso=impl.createLSOutput();
            lso.setCharacterStream(pw);
            LSSerializer writer=impl.createLSSerializer();
            writer.write(newDoc,lso);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4

1 に答える 1

0

問題はシリアライザーとは何の関係もないと判断しました。

次のような簡単なことをしても:

    pw.print("<説明><![CDATA[<p>テキスト</p>]]></説明>");
角括弧の内側のペアが取り除かれます。

ただし、CData で小なり記号をエンコードすると、問題はなくなります。例えば:

    pw.print("<description><![CDATA[<p>一部のテキスト</p>]]></description>");

原因が PrintWriter クラスなのか Lotus Domino なのかはまだわかりませんが、解析とシリアライゼーションの間に XML を修正して修正できるはずです。

于 2012-04-18T07:20:09.080 に答える