Java Получить список или имя всех атрибутов в элементе XML - PullRequest
4 голосов
/ 21 июля 2011

у меня есть элемент xml

   <base baseAtt1="aaa" baseAtt2="tt">
        <innerElement att1="one" att2="two" att3="bazinga"/>
   </base>

и я хотел бы получить список атрибутов. для и базовый элемент и внутренний элемент.

я не знаю имя внутреннего элемента у него может быть много разных имен.

 NodeList baseElmntLst_gold  = goldAnalysis.getElementsByTagName("base");
 Element baseElmnt_gold = (Element) baseElmntLst_gold.item(0);

цель состоит в том, чтобы получить в качестве вывода словарь,

например, для xml над выводом будет словарь с этими значениями.

baseAtt1 = "aaa"
baseAtt2 = "tt"
att1 = "one"
att2 = "two"
att3 = "bazinga"

Я использую JRE 1,5

Ответы [ 4 ]

9 голосов
/ 21 июля 2011

Вот простое решение на основе DOM (однако нет ничего плохого в том, чтобы объединить XPath с DOM в Java):

NodeList baseElmntLst_gold  = goldAnalysis.getElementsByTagName("base");
Element baseElmnt_gold = (Element) baseElmntLst_gold.item(0);

NamedNodeMap baseElmnt_gold_attr = baseElmnt_gold.getAttributes();
for (int i = 0; i < baseElmnt_gold_attr.getLength(); ++i)
{
    Node attr = baseElmnt_gold_attr.item(i);
    System.out.println(attr.getNodeName() + " = \"" + attr.getNodeValue() + "\"");
}

NodeList innerElmntLst_gold = baseElmnt_gold.getChildNodes();
Element innerElement_gold = null;
for (int i = 0; i < innerElmntLst_gold.getLength(); ++i)
{
    if (innerElmntLst_gold.item(i) instanceof Element)
    {
        innerElement_gold = (Element) innerElmntLst_gold.item(i);
        break; // just get first child
    }
}

NamedNodeMap innerElmnt_gold_attr = innerElement_gold.getAttributes();
for (int i = 0; i < innerElmnt_gold_attr.getLength(); ++i)
{
    Node attr = innerElmnt_gold_attr.item(i);
    System.out.println(attr.getNodeName() + " = \"" + attr.getNodeValue() + "\"");
}

Результат:

baseAtt1 = "aaa"
baseAtt2 = "tt"
att1 = "one"
att2 = "two"
att3 = "bazinga"
2 голосов
/ 21 июля 2011

Если вы используете XPath, у вас будет меньше кода, но для решения dom base у меня есть предложение здесь:

public void printElementsAndAttributes() throws Exception {
    DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    org.w3c.dom.Document doc = db.parse(new File("test.xml"));
    NodeList base = doc.getElementsByTagName("base");
    Node basenode = base.item(0);
    System.out.println(basenode.getNodeName() + getAttributesAsString(basenode.getAttributes()));
    NodeList children = basenode.getChildNodes();
    for (int i = 0; i < children.getLength(); i++) {
        Node item = children.item(i);
        if (item.getNodeType() == Node.ELEMENT_NODE) {
            System.out.println(item.getNodeName() + getAttributesAsString(item.getAttributes()));

        }
    }


}

private String getAttributesAsString(NamedNodeMap attributes) {
    StringBuilder sb = new StringBuilder("\n");
    for (int j = 0; j < attributes.getLength(); j++) {
        sb.append("\t- ").append(attributes.item(j).getNodeName()).append(": ").append(attributes.item(j).getNodeValue()).append("\n");
    }
    return sb.toString();

}
2 голосов
/ 21 июля 2011

Вы можете использовать этот XPath для получения всех атрибутов 1-го element узла:

base/element[1]/@*

Чтобы получить все атрибуты всех узлов в вашем XML, вы можете использовать это выражение:

//@*
0 голосов
/ 22 апреля 2015

Используйте этот метод ..

 public static void listAllAttributes(Element element) {

             System.out.println("List attributes for node: " + element.getNodeName());

             // get a map containing the attributes of this node
                 NamedNodeMap attributes = element.getAttributes();

             // get the number of nodes in this map

             int numAttrs = attributes.getLength();


             for (int i = 0; i < numAttrs; i++) {
            Attr attr = (Attr) attributes.item(i);
            String attrName = attr.getNodeName();

 String attrValue = attr.getNodeValue();
  System.out.println("Found attribute: " + attrName + " with value: " + attrValue);

             }
 }

вызовите этот метод, используя следующий вызов в основном методе

  NodeList entries = doc.getElementsByTagName("NameOfTheNode");
                int num = entries.getLength();
                 for (int i=0; i<num; i++) {
                                                  Element node = (Element) entries.item(i);
                                                  listAllAttributes(node);

                          }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...