Warum muss der name der Entität, sofort Folgen mit dem '&' in der entity-Referenz, die für das XML?
Ich habe eine XML-Datei namens /NewFile.xml in der D: Verzeichnis. Die XML-Datei enthält die folgenden details:
HTML:
<?xml version="1.0"?>
<project>
<logindetails id="1001">
<url>https:xxx</url>
<username>xxx</username>
<password>xxx</password>
</logindetails >
<kpi id="1001">
<id_r>reports</id_r>
<id_e>extranet</id_e>
<id_pr>ext-pr</id_pr>
</kpi>
<prkpi id="1001">
<id_1>ext-pr-backlog-age</id_1>
<id_2>ext-timetoassign-prs</id_2>
<id_3>ext-timetodeliver-prs</id_3>
<id_4>ext-timetoresolve-prs</id_4>
<id_5>ext-new-prs</id_5>
</prkpi>
<filtersection id="1001">
<visualizationId>Day,Week,Month,Quarter,Semester,Year,RD Tech Group,ICC,Center,Software Pack,Product,Project,Customer PRs,Severity,Priority</visualizationId>
<projectId>dev/v4.3/r4/e12sqq,BATS,1523 Business IAD & Business CPE,[CoCo2M],VQM</projectId>
</filtersection>
</project>
Den folgenden code hab ich, läuft in eclipse wie folgt:
HTML:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.Select;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class A {
static Properties p= new Properties();
String url=p.getProperty("url");
private static Logger Log = Logger.getLogger(A.class.getName());
public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException, InterruptedException {
WebDriver driver = new FirefoxDriver();
A a = new A();
Actions actions = new Actions(driver);
DOMConfigurator.configure("src/log4j.xml");
String url = a.readXML("logindetails","url");
String username = a.readXML("logindetails","username");
String password = a.readXML("logindetails","password");
//use username for webdriver specific actions
Log.info("Sign in to the OneReports website");
driver.manage().window().maximize();
driver.get(url);
Thread.sleep(5000);
Log.info("Enter Username");
driver.findElement(By.id("loginUsername")).sendKeys(username);
Log.info("Enter Password");
driver.findElement(By.id("loginPassword")).sendKeys(password);
//submit
Log.info("Submitting login details");
waitforElement(driver,120 , "//*[@id='submit']");
driver.findElement(By.id("submit")).submit();
Thread.sleep(5000);
Log.info("Clicking on Reports link");
String id_r = a.readXML("kpi","id_r");
WebElement menuHoverLink = driver.findElement(By.id(id_r));
actions.moveToElement(menuHoverLink).perform();
Thread.sleep(6000);
String id_e = a.readXML("kpi","id_e");
WebElement menuHoverLink1 = driver.findElement(By.id(id_e));
actions.moveToElement(menuHoverLink1).perform();
Thread.sleep(6000);
String id_pr = a.readXML("kpi","id_pr");
WebElement menuHoverLink2 = driver.findElement(By.id(id_pr));
actions.moveToElement(menuHoverLink2).perform();
Thread.sleep(6000);
String id_1 = a.readXML("prkpi","id_1");
WebElement menuHoverLink3 = driver.findElement(By.id(id_1));
actions.moveToElement(menuHoverLink3).click().perform();
Thread.sleep(6000);
}
private static void waitforElement(WebDriver driver, int i, String string) {
//TODO Auto-generated method stub
}
public String readXML(String searchelement,String tag) throws SAXException, IOException, ParserConfigurationException{
String ele = null;
File fXmlFile = new File("D://NewFile.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName(searchelement);
Node nNode = nList.item(0);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
ele=eElement.getElementsByTagName(tag).item(0).getTextContent();
}
return ele;
}
}
Wenn dieser code ausgeführt, ich erhalte die folgende Fehlermeldung in der Konsole wie folgt:
HTML:
Fatal Error] NewFile.xml:27:57: The entity name must immediately follow the '&' in the entity reference.
Exception in thread "main" org.xml.sax.SAXParseException; systemId: file:/D:/NewFile.xml; lineNumber: 27; columnNumber: 57; The entity name must immediately follow the '&' in the entity reference.
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at A.readXML(A.java:94)
at A.main(A.java:40)
Bitte geben Sie mir eine Lösung für dieses Problem..
- Post, die XML-Datei, oder zumindest die Zeile 27. Sie haben wahrscheinlich eine unescaped
&
dort, genau wie die Meldung sagt. - Veröffentlicht die vollständige XML-Datei
- Ich fand heraus, es ist geschehen, weil die projectId in xml mit &.. Aber gibt es eine Möglichkeit zu analysieren, die in XML..
- Es ist nicht gültige XML, so dass die meisten Parser sind zu gehen, um ihn abzulehnen. Wie wurde das XML erzeugt, so dass es ungültige Werte?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie ein unescaped
&
dort, genau wie @chrylis sagt die Meldung sagt. 😉Ändern
Business IAD & Business CPE
zuBusiness IAD & Business CPE
.Siehe auch: Welche Zeichen brauche ich um zu entkommen, die in XML-Dokumenten?
Können Sie nicht verwenden Sie ein kaufmännisches und-Zeichen (
&
) direkt in eine XML-Datei. Ändern Sie diese:zu diesem:
Der Grund für die etwas verwirrende Fehlermeldung, dass, wenn ein XML-Prozessor sieht
&
es erwartet, dass Sie unmittelbar gefolgt von einer entity-name oder ein "character reference", wie&
,<
,≛
usw. So sah der&
in Ihrem Namen und nicht erraten, dass Sie gerade verwendet es falsch.