• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.sdklib.internal.repository;
18 
19 import org.w3c.dom.Node;
20 
21 /**
22  * Misc utilities to help extracting elements and attributes out of an XML document.
23  */
24 class XmlParserUtils {
25 
26     /**
27      * Returns the first child element with the given XML local name.
28      * If xmlLocalName is null, returns the very first child element.
29      */
getFirstChild(Node node, String xmlLocalName)30     public static Node getFirstChild(Node node, String xmlLocalName) {
31 
32         String nsUri = node.getNamespaceURI();
33         for(Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {
34             if (child.getNodeType() == Node.ELEMENT_NODE &&
35                     nsUri.equals(child.getNamespaceURI())) {
36                 if (xmlLocalName == null || xmlLocalName.equals(child.getLocalName())) {
37                     return child;
38                 }
39             }
40         }
41 
42         return null;
43     }
44 
45     /**
46      * Retrieves the value of that XML element as a string.
47      * Returns an empty string whether the element is missing or empty,
48      * so you can't tell the difference.
49      * <p/>
50      * Note: use {@link #getOptionalXmlString(Node, String)} if you need to know when the
51      * element is missing versus empty.
52      *
53      * @param node The XML <em>parent</em> node to parse.
54      * @param xmlLocalName The XML local name to find in the parent node.
55      * @return The text content of the element. Returns an empty string whether the element
56      *         is missing or empty, so you can't tell the difference.
57      */
getXmlString(Node node, String xmlLocalName)58     public static String getXmlString(Node node, String xmlLocalName) {
59         Node child = getFirstChild(node, xmlLocalName);
60 
61         return child == null ? "" : child.getTextContent();  //$NON-NLS-1$
62     }
63 
64     /**
65      * Retrieves the value of that XML element as a string.
66      * Returns null when the element is missing, so you can tell between a missing element
67      * and an empty one.
68      * <p/>
69      * Note: use {@link #getXmlString(Node, String)} if you don't need to know when the
70      * element is missing versus empty.
71      *
72      * @param node The XML <em>parent</em> node to parse.
73      * @param xmlLocalName The XML local name to find in the parent node.
74      * @return The text content of the element. Returns null when the element is missing.
75      *         Returns an empty string whether the element is present but empty.
76      */
getOptionalXmlString(Node node, String xmlLocalName)77     public static String getOptionalXmlString(Node node, String xmlLocalName) {
78         Node child = getFirstChild(node, xmlLocalName);
79 
80         return child == null ? null : child.getTextContent();  //$NON-NLS-1$
81     }
82 
83     /**
84      * Retrieves the value of that XML element as an integer.
85      * Returns the default value when the element is missing or is not an integer.
86      */
getXmlInt(Node node, String xmlLocalName, int defaultValue)87     public static int getXmlInt(Node node, String xmlLocalName, int defaultValue) {
88         String s = getXmlString(node, xmlLocalName);
89         try {
90             return Integer.parseInt(s);
91         } catch (NumberFormatException e) {
92             return defaultValue;
93         }
94     }
95 
96     /**
97      * Retrieves the value of that XML element as a long.
98      * Returns the default value when the element is missing or is not an integer.
99      */
getXmlLong(Node node, String xmlLocalName, long defaultValue)100     public static long getXmlLong(Node node, String xmlLocalName, long defaultValue) {
101         String s = getXmlString(node, xmlLocalName);
102         try {
103             return Long.parseLong(s);
104         } catch (NumberFormatException e) {
105             return defaultValue;
106         }
107     }
108 
109     /**
110      * Retrieve an attribute which value must match one of the given enums using a
111      * case-insensitive name match.
112      *
113      * Returns defaultValue if the attribute does not exist or its value does not match
114      * the given enum values.
115      */
getEnumAttribute( Node archiveNode, String attrName, Object[] values, Object defaultValue)116     public static Object getEnumAttribute(
117             Node archiveNode,
118             String attrName,
119             Object[] values,
120             Object defaultValue) {
121 
122         Node attr = archiveNode.getAttributes().getNamedItem(attrName);
123         if (attr != null) {
124             String found = attr.getNodeValue();
125             for (Object value : values) {
126                 if (value.toString().equalsIgnoreCase(found)) {
127                     return value;
128                 }
129             }
130         }
131 
132         return defaultValue;
133     }
134 
135 }
136