eu tenho o seguinte código
DocumentBuilderFactory dbFactory_ = DocumentBuilderFactory.newInstance(); Document doc_; DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); StringReader reader = new StringReader(s); InputSource inputSource = new InputSource(reader); doc_ = dBuilder.parse(inputSource); doc_.getDocumentElement().normalize();
Então eu posso fazer
doc_.getDocumentElement();
e pegar meu primeiro elemento mas o problema é que ao invés de ser job
o elemento é tns:job
.
Eu sei e tentei usar:
dbFactory_.setNamespaceAware(true);
mas isso não é o que eu estou procurando, eu preciso de algo para me livrar completamente dos namespaces.
Qualquer ajuda seria apreciada, obrigado,
Josh
Para nós Element e Attribute:
Node node = ...; String name = node.getLocalName();
lhe dará a parte local do nome do nó.
Veja Node.getLocalName ()
Use a function Regex. Isso resolverá esse problema:
public static String removeXmlStringNamespaceAndPreamble(String xmlString) { return xmlString.replaceAll("(<\\?[^<]*\\?>)?", ""). /* remove preamble */ replaceAll("xmlns.*?(\"|\').*?(\"|\')", "") /* remove xmlns declaration */ .replaceAll("(<)(\\w+:)(.*?>)", "$1$3") /* remove opening tag prefix */ .replaceAll("()(\\w+:)(.*?>)", "$1$3"); /* remove closing tags prefix */ }
Ao invés de
dbFactory_.setNamespaceAware(true);
Usar
dbFactory_.setNamespaceAware(false);
Embora eu concorde com Tomalak: em geral, namespaces são mais úteis do que prejudiciais. Por que você não quer usá-los?
Edit: esta resposta não responde a pergunta do OP, que era como se livrar de prefixos de namespace. RD01 forneceu a resposta correta para isso.
Você pode pré-processar o XML para remover todos os namespaces, se é absolutamente necessário fazê-lo. Eu recomendaria contra isso, já que a remoção de namespaces de um documento XML é essencialmente comparável à remoção de namespaces de uma estrutura de programação ou biblioteca – você arrisca conflitos de nome e perde a capacidade de diferenciar elementos outrora distintos. No entanto, é o seu funeral. 😉
Essa transformação XSLT remove todos os namespaces de qualquer documento XML.
Aplique-o ao seu documento XML. Exemplos de Java para fazer uma coisa dessas devem ser suficientes, mesmo neste site. O documento resultante terá exatamente a mesma estrutura e layout, apenas sem namespaces.
public static void wipeRootNamespaces(Document xml) { Node root = xml.getDocumentElement(); NodeList rootchildren = root.getChildNodes(); Element newroot = xml.createElement(root.getNodeName()); for (int i=0;i
Tomalak, uma correção do seu XSLT (no terceiro template):
O tamanho da input xml também precisa ser considerado ao escolher a solução. Para xmls grandes, no tamanho de ~ 100k, possível se sua input for de um serviço da Web, você também precisará considerar as implicações da garbage collection ao manipular uma cadeia grande. Usamos String.replaceAll antes e isso causou OOM freqüente na produção com um tamanho de heap de 1.5G devido à maneira como replaceAll está implementado.
Você pode consultar http://app-inf.blogspot.com/2013/04/pitfalls-of-handling-large-string.html nossas descobertas.
Não sei ao certo como o XSLT lida com objects String grandes, mas acabamos analisando a string manualmente para remover os prefixos em uma análise para evitar a criação de objects java grandes adicionais.
public static String removePrefixes(String input1) { String ret = null; int strStart = 0; boolean finished = false; if (input1 != null) { //BE CAREFUL : allocate enough size for StringBuffer to avoid expansion StringBuffer sb = new StringBuffer(input1.length()); while (!finished) { int start = input1.indexOf('<', strStart); int end = input1.indexOf('>', strStart); if (start != -1 && end != -1) { // Appending anything before '<', including '<' sb.append(input1, strStart, start + 1); String tag = input1.substring(start + 1, end); if (tag.charAt(0) == '/') { // Appending '/' if it is "" sb.append('/'); tag = tag.substring(1); } int colon = tag.indexOf(':'); int space = tag.indexOf(' '); if (colon != -1 && (space == -1 || colon < space)) { tag = tag.substring(colon + 1); } // Appending tag with prefix removed, and ">" sb.append(tag).append('>'); strStart = end + 1; } else { finished = true; } } //BE CAREFUL : use new String(sb) instead of sb.toString for large Strings ret = new String(sb); } return ret; }
Em vez de usar o TransformerFactory e, em seguida, chamar transform nele (que estava injetando o namespace vazio, eu o transformei da seguinte forma:
OutputStream outputStream = new FileOutputStream(new File(xMLFilePath)); OutputFormat outputFormat = new OutputFormat(doc, "UTF-8", true); outputFormat.setOmitComments(true); outputFormat.setLineWidth(0); XMLSerializer serializer = new XMLSerializer(outputStream, outputFormat); serializer.serialize(doc); outputStream.close();