почему я получаю SAXparseException «Должен быть объявлен тип элемента», хотя он был объявлен при загрузке файла XML в Свойства объекта? - PullRequest
0 голосов
/ 25 апреля 2020

Я новичок ie до java и затмение. Я пытался загрузить файл XML с помощью properties.loadFrom XML () и попытался прочитать имена свойств. но я закончил с получением SAXparseException, говоря «тип элемента должен быть объявлен», хотя я определил DTD для моего XML файла. Может ли кто-нибудь помочь мне? это мой XML файл

<?xml version="1.0"?>
<!DOCTYPE test [
<!ELEMENT test (name, price, hsn)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT hsn (#PCDATA)>
]>
<test>
    <name>groundnut</name>
    <price>5.00</price>
    <hsn>ABCDE</hsn>
</test>

это мой java код: import java .util.Properties; import java .util.Set;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import java.io.File;
import java.io.IOException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

import java.io.*;


public class test 
{
    public static void main(String args[]) throws Exception
    {
        Properties p = new Properties();
        InputStream is = new FileInputStream("resources/test.XML");
        p.loadFromXML(is);
        System.out.print(p.stringPropertyNames());

    }
}

это вывод, который я получил:

Exception in thread "main" java.util.InvalidPropertiesFormatException: jdk.internal.org.xml.sax.SAXParseException; Element type "test" must be declared.
at java.base/jdk.internal.util.xml.PropertiesDefaultHandler.load(PropertiesDefaultHandler.java:85)
at java.base/java.util.Properties.loadFromXML(Properties.java:956)
at test.main(test.java:28)

Причина: jdk.internal.org. xml .sax.SAXParseException ; Тип элемента «тест» должен быть объявлен. в java .base / jdk.internal.util. xml .PropertiesDefaultHandler.startElement (PropertiesDefaultHandler. java: 169) в java .base / jdk.internal.util. xml .impl.ParserSAX. parse (ParserSAX. java: 470) на java .base / jdk.internal.util. xml .impl.ParserSAX.parse (ParserSAX. java: 411) на java .base / jdk. internal.util. xml .impl.ParserSAX.parse (ParserSAX. java: 374) в java .base / jdk.internal.util. xml .impl.SAXParserImpl.parse (SAXParserImpl. java : 97) в java .base / jdk.internal.util. xml .PropertiesDefaultHandler.load (PropertiesDefaultHandler. java: 83) ... еще 2

1 Ответ

1 голос
/ 25 апреля 2020

Импорт XML с использованием Properties.loadFromXML() не поддерживает использование пользовательских DTD. Он поддерживает только DTD, задокументированный в свойствах Javado c.

Не ясно, почему вы думаете, что вы можете использовать альтернативное DTD для чтения в свойствах, подобных этому.

Вместо этого вам придется изменить документ XML, чтобы он соответствовал DTD свойств:

<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <entry key="name">groundnut</entry>
    <entry key="price">5.00</entry>
    <entry key="hsn">ABCDE</entry>
</properties>
...