【问题标题】:File not found exception when using XPath for XML parsing使用 XPath 进行 XML 解析时找不到文件异常
【发布时间】:2015-11-05 10:02:56
【问题描述】:

我正在尝试编写一个 Java 程序来为已经存在的 XML 文件添加属性。XML 是:

 <Items  ApplyDifferences="Y" ValidateItems="Y" CompleteInventoryFlag="Y"  ShipNode=" ACMEUSDC" >
        <Item InventoryOrganizationCode="ACMEUS" ItemID="2000033672234"  
        ProductClass="GOOD" UnitOfMeasure="EACH">
           <Supplies>
<Supply AvailabilityType="TRACK" Quantity="20.00" ShipByDate="2500-01-01" 
    SupplyType="ONHAND"/> 
         </Supplies>
        </Item>
        <Item InventoryOrganizationCode="ACMEUS" ItemID="2000033672235"  
        ProductClass="GOOD" UnitOfMeasure="EACH">
           <Supplies>
  <Supply AvailabilityType="TRACK" Quantity="25.00" ShipByDate="2500-01-01"   
    SupplyType="ONHAND"/> 
           </Supplies>
       </Item>
       <Item InventoryOrganizationCode="ACMEUS" ItemID="2000033672236" 
        ProductClass="GOOD" UnitOfMeasure="EACH">
          <Supplies>
    <Supply AvailabilityType="TRACK" Quantity="25.00" ShipByDate="2500-01-01"  
    SupplyType="ONHAND"/> 
         </Supplies>
       </Item>
 </Items>

我的 Java 代码是:

    package xmltest;
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class Testxml4 {

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException, TransformerException {
        // TODO Auto-generated method stub

        DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        File inputFile = new File("C:/Users/praveen.sharma/Desktop/XMLs/xml4.xml");
        System.out.println(new File(".").getAbsolutePath());
        System.out.println(inputFile.exists());


        Document doc = builder.parse(inputFile);
        Element element = (Element) XPathAPI.selectSingleNode(doc,"Order/OrderLines/OrderLine[@PrimeLineNo='6']/OrderLineSourcingControls/OrderLineSourcingCntrl[@Node='Node1']");
        element.setAttribute("Node", "Node02");

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(inputFile);
        transformer.transform(source, result);

    }

}

这是我得到的错误:

Exception in thread "main" javax.xml.transform.TransformerException: java.io.FileNotFoundException: file:\C:\Users\praveen.sharma\Desktop\XMLs\xml4.xml (The filename, directory name, or volume label syntax is incorrect)
    at org.apache.xalan.transformer.TransformerIdentityImpl.createResultContentHandler(TransformerIdentityImpl.java:263)
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:296)
    at xmltest.Testxml4.main(Testxml4.java:46)
Caused by: java.io.FileNotFoundException: file:\C:\Users\praveen.sharma\Desktop\XMLs\xml4.xml (The filename, directory name, or volume label syntax is incorrect)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at org.apache.xalan.transformer.TransformerIdentityImpl.createResultContentHandler(TransformerIdentityImpl.java:253)
    ... 2 more
---------
java.io.FileNotFoundException: file:\C:\Users\praveen.sharma\Desktop\XMLs\xml4.xml (The filename, directory name, or volume label syntax is incorrect)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at org.apache.xalan.transformer.TransformerIdentityImpl.createResultContentHandler(TransformerIdentityImpl.java:253)
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:296)
    at xmltest.Testxml4.main(Testxml4.java:46)

我可以向您保证,我的 XML 存在于指定路径中并且拥有所有必需的权限。

【问题讨论】:

  • 您已成功读取并解析文件。它是失败的输出。可能是因为该文件仍被另一个程序打开和锁定。您可以先尝试写入不同的文件,看看是否成功。
  • 尝试创建另一个输出文件。得到输出文件的文件未找到错误。
  • 那么你可能权限问题
  • 直到昨天它工作正常。我什至有生成的输出文件。我不知道发生了什么,但我从早上开始就收到错误。

标签: java xml xpath filenotfoundexception


【解决方案1】:

您正在尝试将输出写入您正在阅读的同一文件。您应该改为写入其他文件。

如果要“更改”同一个文件,那么最安全的方法是写入临时文件,然后关闭所有流,然后删除原始文件,然后将临时文件重命名为原始名称。

【讨论】:

  • 正如我在之前的 cmets 中提到的,我尝试创建一个不同的输出文件。事实上,最初我只是这样做。我只有在开始出现 FileNotFound 异常时才切换到编辑原始文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多