Java - 清除XML标记并获取属性

时间:2017-05-12 17:23:29

标签: java xml

我有下一个要分析的XML文件:

<?xml version="1.0" encoding="windows-1252"?>
<!DOCTYPE colHAREM>
<colHAREM versao="Segundo_dourada_com_relacoes_14Abril2010">
<DOC DOCID="H2-dftre765">
<P>A Reforma Religiosa e Política
  na
  <EM ID="H2-dftre765-28" CATEG="LOCAL" TIPO="HUMANO" SUBTIPO="PAIS" COREL="H2-dftre765-37" TIPOREL="incluido">Inglaterra</EM>
</P>
 <P>
<EM ID="H2-dftre765-29" CATEG="PESSOA" TIPO="INDIVIDUAL" COREL="H2-dftre765-28" TIPOREL="natural_de">Henrique VIII</EM>
  O curso da
  <EM ID="H2-dftre765-30" CATEG="ACONTECIMENTO|OBRA" TIPO="EFEMERIDE|PLANO" COREL="H2-dftre765-26" TIPOREL="ident">Reforma</EM>
  foi diferente na
  <EM ID="H2-dftre765-31" CATEG="LOCAL" TIPO="HUMANO" SUBTIPO="PAIS" COREL="H2-dftre765-31" TIPOREL="ident">Inglaterra</EM>
  . Tinha havido desde há muito uma forte corrente anti-clerical, tendo a
  <EM ID="H2-dftre765-32" CATEG="PESSOA|LOCAL" TIPO="POVO|HUMANO" SUBTIPO="|PAIS" COREL="H2-dftre765-28 H2-dftre765-28" TIPOREL="LOCAL**ident**H2-dftre765-28**LOCAL PESSOA**natural_de**H2-dftre765-28**LOCAL">Inglaterra</EM>
  já tido o movimento
  <EM ID="H2-dftre765-33" CATEG="ABSTRACCAO" TIPO="DISCIPLINA" COREL="H2-dftre765-28" TIPOREL="praticado_em">Lollard</EM>
  , que inspirou os
  <EM ID="H2-dftre765-34" CATEG="PESSOA" TIPO="GRUPOMEMBRO">Hussitas</EM>
  na
  <EM ID="H2-dftre765-35" CATEG="LOCAL" TIPO="HUMANO" SUBTIPO="REGIAO" COREL="H2-dftre765-34 H2-dftre765-31" TIPOREL="pratica_se incluido">Boémia</EM>
  . Mas
  <EM ID="H2-dftre765-39" CATEG="TEMPO" TIPO="TEMPO_CALEND" SUBTIPO="DATA" COREL="H2-dftre765-72" TIPOREL="incluido">em cerca de 1520</EM>
  , no entanto, os
  <EM ID="H2-dftre765-40" CATEG="PESSOA" TIPO="GRUPOMEMBRO" COREL="H2-dftre765-33" TIPOREL="praticante_de">Lollards</EM>
  não eram já uma força activa, ou pelo menos um movimento de massas.
</P>
</DOC>
</colHAREM>

目标是调查属性 并提取“ CATEG ”和“ TIPO ”,然后属性

我收到了以下代码:

import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.*;
import org.xml.sax.SAXException;

public class xml { 

public static void main(String[] args) throws Exception {

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    Document doc = null;
    NodeList nodes = null;
    //Set<String> ids = null;
    try {
        doc = factory.newDocumentBuilder().parse(new File("teste.xml"));

        XPathExpression expr = XPathFactory.newInstance().newXPath().compile("//@TIPO");
        //ids = new HashSet<String>();
        nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (XPathExpressionException e) {
        e.printStackTrace();
    }

    for (int i = 0; i < nodes.getLength(); i++) {
        //System.out.println("."); //progress indicator
        Element el = ((Attr) nodes.item(i)).getOwnerElement();
        if ( el.hasAttribute("CATEG") || el.hasAttribute("TIPO"))
        {
            System.out.println(el.getAttribute("CATEG")+ " - "+el.getAttribute("TIPO"));//el.removeAttribute("siteKey");
            //System.out.println(el.getLocalName().trim()); 
        }

    }
  }
}

输出结果为:

LOCAL - HUMANO
PESSOA - INDIVIDUAL
ACONTECIMENTO|OBRA - EFEMERIDE|PLANO
LOCAL - HUMANO
PESSOA|LOCAL - POVO|HUMANO
ABSTRACCAO - DISCIPLINA
PESSOA - GRUPOMEMBRO
LOCAL - HUMANO
TEMPO - TEMPO_CALEND
PESSOA - GRUPOMEMBRO

我想要类似的东西:

LOCAL - HUMANO - Inglaterra
PESSOA - INDIVIDUAL - Henrique_VIII
......
TEMPO - TEMPO_CALEND - em_cerca_de_1520
PESSOA - GRUPOMEMBRO - Lollards

我不知道如何获取属性,请注意我需要将ATTRIBUTES连接到_ 例如:em cerca de 1520应该是em_cerca_de_1520,这就是这里的属性标签。

提前谢谢。

3 个答案:

答案 0 :(得分:1)

此处也提出了类似的问题:How can i get element text in node in Java?

请将您的打印声明更改为以下内容:

class ApplicationContext : Application() {
    var baseComponent: BaseComponent? = null
        private set

    override fun onCreate() {
        super.onCreate()

        initializeInjector()
    }

    private fun initializeInjector() {
        // DaggerBaseComponent is and unresolved reference
        baseComponent = DaggerBaseComponent.builder() 
                .appModule(AppModule(this))
                .endpointModule(EndpointModule())
                .build()
    }

    companion object {

        operator fun get(context: Context): ApplicationContext {
            return context.applicationContext as ApplicationContext
        }
    }
}

我认为你对xmls中元素和属性之间的区别有一点误解,双引号中的值是属性值,但是你想要添加的值是元素的文本值(而不是属性)。

答案 1 :(得分:1)

你可以做这样的事情:

System.out.println(el.getAttribute("CATEG")+ " - "+el.getAttribute("TIPO")) + " -" +el.getFirstChild().getNodeValue()

答案 2 :(得分:0)

感谢您的帮助。 用&#34; _&#34;替换所有空白区域我用:

elem= elem.replaceAll("\\s+","_");