0

XML次のように構成された文字列をサーバーから受け取ります。

<item_list>
    <category>
        <item id="1" name="name1" base64="base64String1" />
        <item id="2" name="name2" base64="base64String2" />
        <item id="3" name="name3" base64="base64String3" />
        <item id="4" name="name4" base64="base64String4" />
        ........
    </category>
    <category>
    ........
    </category>
<item_list>

私がする必要があるのはこれです:私が最初に文字列を読んだとき、文字列を読んで、Base64それらをファイルに保存してから、この文字列からそれらを削除します。そして、この文字列をXMLファイルに書き込みます。したがって、その後、これXMLは次のようになります。

<item_list>
    <category>
        <item id="1" name="name1" />
        <item id="2" name="name2" />
        <item id="3" name="name3" />
        <item id="4" name="name4" />
        ........
    </category>
    <category>
    ........
    </category>
<item_list>

Base64文字列の読み取りと削除に使用するパーサーショーはどれですか?これに最適なのはどれですか?

そして、誰かが私にこれを行う方法の例またはチュートリアルを与えることができれば、それは素晴らしいことです。

4

2 に答える 2

2

これには、式クエリ「//*[@base64]」で XPath を使用できます。

try {
            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
            builderFactory.setNamespaceAware(true);
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
            Document document = builder.parse(new File("your_xml.xml"));

            XPath xpath = XPathFactory.newInstance().newXPath();
            String expression = "//*[@base64]";

            NodeList nodes = (NodeList) xpath.evaluate(expression, document, XPathConstants.NODESET);
            for (int i = 0; i < nodes.getLength(); i++) {
                Element element = (Element) nodes.item(i);
                String base64 = element.getAttribute("base64");
                element.removeAttribute("base64");
            }

            String newXML = getStringFromNode(document);
        }
        catch (Exception e) {

        }

getStringFromNode メソッド

public static String getStringFromNode(Node root) {

        StringBuilder result = new StringBuilder();

        if (root.getNodeType() == 3)
            result.append(root.getNodeValue());
        else { 
            if (root.getNodeType() != 9) {
                StringBuffer attrs = new StringBuffer();
                for (int k = 0; k < root.getAttributes().getLength(); ++k) {
                    attrs.append(" ").append(
                            root.getAttributes().item(k).getNodeName()).append(
                            "=\"").append(
                            TextUtils.htmlEncode(root.getAttributes().item(k).getNodeValue()))
                            .append("\" ");
                }
                result.append("<").append(root.getNodeName()).append(" ")
                        .append(attrs).append(">");
            } else {
                result.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            }

            NodeList nodes = root.getChildNodes();
            for (int i = 0, j = nodes.getLength(); i < j; i++) {
                Node node = nodes.item(i);
                result.append(getStringFromNode(node));
            }

            if (root.getNodeType() != 9) {
                result.append("</").append(root.getNodeName()).append(">");
            }
        }
        return result.toString();
    }

編集済み

同じことを文字列の解析にも使用できます。以下のメソッドを参照してください。これは、文字列を DOM ドキュメントとして解析します。これで、このドキュメントを XPath の入力として使用できます。

public static Document ReadDocument(String xml)
    {
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            dbf.setNamespaceAware(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            InputSource is = new InputSource();
            StringReader reader = new StringReader(xml);
            is.setCharacterStream(reader);
            doc = db.parse(is); 
        } catch (Exception e) {
            Log.e("Error", "Error while Parsing Document", e);
            return null;
        }
        return doc;
    }
于 2012-12-18T13:40:31.453 に答える
0

Vivekの関数のマイナーな改善->CDATAの処理+フィールド定数の使用:

public static String getStringFromNode(Node root) throws IOException 
{
    StringBuilder result = new StringBuilder();

    if (root.getNodeType() == Node.TEXT_NODE)
        result.append(root.getNodeValue());
    else if(root.getNodeType() == Node.CDATA_SECTION_NODE)
        result.append("<![CDATA["+root.getNodeValue()+"]]>");
    else {
        if (root.getNodeType() != Node.DOCUMENT_NODE) {
            StringBuffer attrs = new StringBuffer();

            for (int k = 0; k < root.getAttributes().getLength(); ++k) {
                attrs.append(" ").append(
                        root.getAttributes().item(k).getNodeName()).append(
                        "=\"").append(
                        root.getAttributes().item(k).getNodeValue())
                        .append("\" ");
            }
            result.append("<").append(root.getNodeName()).append(" ")
                    .append(attrs).append(">");
        } else {
            result.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        }

        NodeList nodes = root.getChildNodes();
        for (int i = 0, j = nodes.getLength(); i < j; i++) {
            Node node = nodes.item(i);
            result.append(getStringFromNode(node));
        }

        if (root.getNodeType() != Node.DOCUMENT_NODE) {
            result.append("</").append(root.getNodeName()).append(">");
        }
    }
    return result.toString();
}
于 2013-01-31T15:25:52.150 に答える