gpt4 book ai didi

java - 在Java中解析xml时是否可以忽略/跳过节点

转载 作者:行者123 更新时间:2023-11-29 06:20:32 25 4
gpt4 key购买 nike

我正在尝试从此 XML 中删除 SOAPns2 节点:

<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>

在此之前这可能吗:

Document doc = parser.parse(xmlFile); 
NodeList startlist = doc.getChildNodes();

我尝试将其作为字符串读取,然后像这样将其写回 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");

但当我传递多个标记参数以忽略/从文件中删除时,它不起作用。我敢肯定有更优雅的方式来做到这一点,我只是想不出任何。

最佳答案

您可以使用 StAX filter :

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();

仅供引用:SOAP-ENV 和 ns2 不是元素;它们是 namespace 前缀。文档格式错误 - 缺少命名空间声明,上面的代码不是我为有效的命名空间文档编写的代码。

关于java - 在Java中解析xml时是否可以忽略/跳过节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3231159/

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