gpt4 book ai didi

Java DOM 弄乱了我的 XML header 并自行添加属性

转载 作者:太空宇宙 更新时间:2023-11-04 08:39:52 27 4
gpt4 key购买 nike

我编写的一个小程序出现问题。它很好地完成了我想要做的事情(添加/删除/修改属性)——我对这部分感到非常兴奋。但是当我输出文件时,我的标题会发生变化,并且某些元素会自动添加属性。

这是我的开始:

<!DOCTYPE TEI SYSTEM "teilite-ur.dtd">
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<teiHeader>
<fileDesc>
...
<availability>
...

将每个元素节点转换为包含附加属性(名称=测试,值=工作)后,这就是我最终得到的结果:

<TEI xmlns="http://www.tei-c.org/ns/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" test="working">
<teiHeader test="working" type="text">
<fileDesc test="working">
...
<availability default="false" status="unknown" test="working">
...

简短概述:

  • !DOCTYPE 行已删除
  • xmlns:xsi...已添加
  • type="text"、default="false"、status="unknown"anchored="true"属性会自动添加(可能还有其他属性,但这些是我突然想到的)。

我在这里阅读了[http://stackoverflow.com/questions/2133395/remove-xml-declaration-from-the- generated-xml-document-using-java]如何防止将XML声明添加到顶部。但是,我不确定如何禁用其余的添加内容。

谢谢!

这里有一些独立的代码,基本上可以完成我想要的功能(在实际程序中进行更多定制,但这不应该相关)和相关的 IBM tutorial我用来帮助构建它的:

package xml_attrib_test;

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class Main {

public static void main(String[] args) {
//Input
File whichFile = new File("C:\\Users\\mw2xx\\Desktop\\proceedings.vol1.xml");

DocumentBuilderFactory domFactory;
DocumentBuilder builder;
Document doc;
XPathFactory factory;
XPath xpath;
XPathExpression expr;
NodeList nodes;

try {
domFactory = DocumentBuilderFactory.newInstance();
domFactory.setSchema(null);
domFactory.setValidating(false);
domFactory.setNamespaceAware(true);
domFactory.setExpandEntityReferences(false);
builder = domFactory.newDocumentBuilder();
doc = builder.parse(whichFile);

factory = XPathFactory.newInstance();
xpath = factory.newXPath();
expr = xpath.compile("//*");

Object result = expr.evaluate(doc, XPathConstants.NODESET);
nodes = (NodeList) result;
} catch (Exception ex) {
System.out.println("Error in parser.");
return;
}

// Do Stuff With the XML Doc

String attributeTag = "test";
String attrValue = "working";

for (int j = 0; j < nodes.getLength(); j++) {
Node n = nodes.item(j);

if (n.getNodeType() == Node.ELEMENT_NODE) {
Element e = (Element) n;
e.setAttribute(attributeTag, attrValue);
} else if (n.getNodeType() == Node.ATTRIBUTE_NODE) {
Attr a = (Attr) n;
if (a.getName().equals(attributeTag)) {
a.setValue(attrValue);
}
}
}

// Output
TransformerFactory tFactory;
Transformer transformer;
DOMSource source;
File resultFile;
StreamResult result;

try {
tFactory = TransformerFactory.newInstance();
transformer = tFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

source = new DOMSource(doc);
resultFile = new File("$$$$$.tmp");
result = new StreamResult(resultFile);
transformer.transform(source, result);
} catch (Exception ex) {
System.out.println("Error in transformer.");
return;
}

whichFile.delete();
resultFile.renameTo(whichFile);

System.out.println("Success!");
}
}

最佳答案

经过几天的谷歌搜索和堆栈溢出搜索,我发现了一个类似的问题,它提供了我需要的设置。

domFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

Java change and move non-standard XML file

关于Java DOM 弄乱了我的 XML header 并自行添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5583249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com