Подсчитать количество тегов в файле XAML - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть XAML-файл, в котором теги выглядят примерно так:

<ActorName Name="Nancy" Enabled="False"> 
<ActorName Name="Shivani" Enabled="True"> 

Я приложил приведенный ниже код, который считает эти теги, но я не могу его подвести. Как вернуть сумму всех тегов, которые имеют Enabled="True">?

package com.test;

import java.io.IOException;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Test {

    public static void main(String[] args) {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        DocumentBuilder builder;

        try {
            builder = factory.newDocumentBuilder();

            Document doc=builder.parse("C:\\Users\\nprabhasini\\Desktop\\ShivaSoft.xml");

            NodeList nodes = doc.getElementsByTagName("ActorName");

            for(int i=0;i<nodes.getLength();i++)
            {
                printNodeInfo(nodes.item(i));
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    static void  printNodeInfo(Node node)
    { 

        if(node.hasAttributes())
        {
            NamedNodeMap rootAtt = node.getAttributes();

            for(int i=0;i<rootAtt.getLength();i++)
            {  

                String s1=rootAtt.item(i).getNodeValue();
                if(s1.equalsIgnoreCase("True"))
                {
                    i++;
                    System.out.println(i);      
                }
            }
        }
    }

    static String nodeType(short type) {

        switch(type) {
            case Node.ELEMENT_NODE:               return "Element";
            case Node.ATTRIBUTE_NODE:             return "Attribute";
        }

        return "Unidentified";
      }
}

1 Ответ

0 голосов
/ 28 апреля 2020

Вы можете использовать простое выражение XPath-1.0, например

count(//ActorName[@Enabled='True'])

с Java. Просто настройте XPathExpression ниже под свои нужды. Конечно, имя файла может быть sample.xaml или аналогичным.
Это пример кода:

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class a {

    public static void main(String[] args) {
        try {
            File inputFile = new File("sample.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            dbFactory.setValidating(false);
            DocumentBuilder dBuilder;
            dBuilder=dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(inputFile);
            doc.getDocumentElement().normalize();
            XPath xPath =  XPathFactory.newInstance().newXPath();
            String XPathExpression = "count(//ActorName[@Enabled='True'])"; 
            // Get the count of the elements with the given properties
            Number cnt = (Number)xPath.compile(XPathExpression).evaluate(doc, XPathConstants.NUMBER);
            // Convert the Float value to an int value and output
            System.out.println("Items: "+cnt.intValue());
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XPathExpressionException e) {
            e.printStackTrace();
      }
  }
}
...