在Java中解析xml时是否可以忽略/跳过节点
我正在尝试从此XML中删除在Java中解析xml时是否可以忽略/跳过节点,java,xml,Java,Xml,我正在尝试从此XML中删除SOAP和ns2节点: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns2:createCustomer> <Customer&g
SOAP
和ns2
节点:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns2:createCustomer>
<Customer>
<CustomerId/>
<names>
<firstName>fName</firstName>
<lastName>lName</lastName>
<middleName>nName</middleName>
<nickName/>
</names>
<addressList>
<address>
<streetInfo>
<houseNumber>22</houseNumber>
<baseName>Street base name</baseName>
<district>kewl district</district>
</streetInfo>
<zipcode>22231</zipcode>
<state>xxx</state>
<country>xxxz</country>
<primary>true</primary>
</address>
</addressList>
<SSN>561381</SSN>
<phone>
<homePhone>123123123</homePhone>
<officePhone/>
<homePhone>21319414</homePhone>
</phone>
<preferred>true</preferred>
</Customer>
</ns2:createCustomer>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我尝试将其读取为字符串,然后将其写回XML文件,如下所示:
private void preParsing(String fileName,String ...tags) {
try {
BufferedReader br = new BufferedReader(new FileReader(new File(fileName)));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
for (String string : tags) {
if(!line.contains(string)){
sb.append(line);
sb.append("\n");
}
}
}
System.out.println(sb.toString());
br.close();
} catch (IOException e) {
System.err.println("Error occured: " + e.getMessage());
}
}
如果我只忽略一个标记,它就会起作用,如:
preParsing("src/main/resources/test.xml", "SOAP");
但当我传递多个标记参数以忽略/从文件中删除时,它不起作用。我相信有更优雅的方式来做这件事,我想不出任何方式 最好是正常加载文档,并使用XPath获取所需的部分 在上有一些很好的信息,您可以使用StAX:
仅供参考:SOAP-ENV和ns2不是元素;它们是名称空间前缀。文档格式不正确-缺少名称空间声明&以上代码不是我为有效的名称空间文档编写的代码。操作XML文档的常用方法是使用XSLT。例如,这允许您编写过滤器,可以删除特定命名空间中的任何标记,等等
XSLT语言与Java有很大的不同,但自1.4版起,Java中就有一个XSLT处理器(检查模板和转换器类),因此它得到了很好的支持。我收到了一个错误“error:'前缀'soapenv'的名称空间尚未声明”。”,我该如何修复它?我想说的是SOAP-ENVsorry@c0mrade-在StAX解析器上设置
是\u NAMESPACE\u AWARE
false将禁用命名空间感知。使用相同的文档和示例代码,将删除所有带前缀的元素。XSLT需要名称空间意识,因此如果您有其他带有前缀的元素,则在生成DOM时需要对有效文档进行操作或避免转换。虽然这不是完整的解决方案,但它确实让我达到了目的,谢谢您的时间和努力谢谢您的回答您能提供一些链接让我开始吗
preParsing("src/main/resources/test.xml", "SOAP");
class MyFilter implements EventFilter {
private final List<String> filtered = Arrays.asList("SOAP-ENV:Envelope",
"SOAP-ENV:Body", "ns2:createCustomer");
@Override
public boolean accept(XMLEvent event) {
if (event.isStartElement())
for (String elementName : filtered)
if (event.asStartElement().getName().getLocalPart().equals(
elementName))
return false;
if (event.isEndElement())
for (String elementName : filtered)
if (event.asEndElement().getName().getLocalPart().equals(
elementName))
return false;
return true;
}
}
DOMResult result = new DOMResult();
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
xmlInputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false);
XMLEventReader reader = xmlInputFactory
.createXMLEventReader(new StreamSource(new File("soap.xml")));
reader = xmlInputFactory.createFilteredReader(reader, new MyFilter());
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.transform(new StAXSource(reader), result);
Document document = (Document) result.getNode();