Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中解析xml时是否可以忽略/跳过节点_Java_Xml - Fatal编程技术网

在Java中解析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

我正在尝试从此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>
        <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();