4 Stimmen

java Ermittelt die Liste oder den Namen aller Attribute in einem XML-Element

Ich habe ein Xml-Element

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

und ich würde gerne die Liste der Attribute erhalten. für ambos das Basiselement und das innere Element.

i weiß nicht der Name des innerElements es kann viele verschiedene Namen haben.

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

Das Ziel ist es, eine Art Wörterbuch als Ausgabe zu erhalten,

z.B. für die obige XML-Datei wird ein Wörterbuch mit diesen Werten ausgegeben.

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

Ich verwende JRE 1.5

9voto

Grzegorz Szpetkowski Punkte 35954

Hier ist eine einfache DOM-basierte Lösung (es ist jedoch nicht falsch, XPath mit DOM in Java zu kombinieren):

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() + "\"");
}

Ergebnis:

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

2voto

Kirill Polishchuk Punkte 52625

Sie können diesen XPath verwenden, um alle Attribute von 1st element Knoten:

base/element[1]/@*

Um alle Attribute aller Knoten in Ihrem XML zu erhalten, können Sie diesen Ausdruck verwenden:

//@*

2voto

Tommy Punkte 493

Wenn Sie XPath verwenden, werden Sie weniger Code haben, aber für eine Dom-Basis-Lösung habe ich hier einen Vorschlag:

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();

}

1voto

Mayank Gaur Punkte 45

Verwenden Sie diese Methode..

 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);

             }
 }

diese Methode mit folgendem Aufruf in der Hauptmethode aufrufen

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

                          }

0voto

Jayram Gaonkar Punkte 1
NodeList bList = eElement.getElementsByTagName("base");
Node node1 = bList.item(0);

if (node1.getNodeType() == node1.ELEMENT_NODE) {
                     Element ele = (Element) node1;
                     System.out.print("Attribute : ");
                     System.out.println(ele.getAttributes());
                  }

Sollte funktionieren.

Eine sehr gute Erklärung finden Sie unter https://www.tutorialspoint.com/java_xml/java_xml_quick_guide.htm Das können Sie nachlesen, um mehr Klarheit zu erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X