我浏览网页.我发现XMLStreamReader是用于解析XML的Cursor样式API.而XMLEventReader的是迭代器风格的API用于解析XML .Could任何一个详细的告诉我?
使用XMLStreamReader开始学习StAX,我遇到了一些问题.如何将标签之间的所有内容作为文本?我的意思是,我知道所需标签的名称,当我找到它时,我必须转到关闭标签,我发现它们之间的所有内容我必须附加一些字符串.例如,我们有类似的东西
<rootTag>
...    
    <someTag>
        Some text content and other tags here…
    </someTag >
    <tagINeed>
        <someinternalTag1>
            <someinternalTag11>
                Some text content..
            </someinternalTag11>
            ...
        </someinternalTag1>
        <someinternalTag2>
            Something here
        </someinternalTag2>
    </tagINeed>
...
    <somethingAnother>
...
    </somethingAnother >
...
</rootTag>    
所以,我需要把我的字符串作为
        <someinternalTag1>
            <someinternalTag11>
                Some text content..
            </someinternalTag11>
            ...
        </someinternalTag1>
        <someinternalTag2>
            Something here
        </someinternalTag2>
我怎么才能得到它?也许,我必须在源xml中找到所需块的开始和结束偏移,并在解析后给出子串?
我目前正在使用我的XSD来验证我的xml.这部分工作正常我的问题是我想要获取无效的标签/值的元素.
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(xml));
    XMLStreamReader reader = null;
    SchemaFactory factory=SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = factory.newSchema(xsdschemalocation);
    Validator validator = schema.newValidator(); 
    try
    {
        reader = XMLInputFactory.newInstance().createXMLStreamReader(new StreamSource(new StringReader(xml)));
    } catch (XMLStreamException ex)
    {
        LogController.getLogger().logSEVERE("Unable to create the streamreader from the xml source", ex.getLocalizedMessage());
        return false;
    }
    try
    {
        validator.validate(new StAXSource(reader));
    }
    catch (IOException ex)
    {
        LogController.getLogger().logSEVERE("IOException in the validatation has been caused as the reader has become null", ex.getLocalizedMessage());
        return false;
    }
catch(SAXException saxe)
    {
        LogController.getLogger().logWARNING("Their is a validation …我想在我们的代码库中重用一些现有的代码来接受XMLStreamReader我的应用程序将所需的数据作为w3c文档.
以下示例是最小测试用例:
public static void main(String[] args) throws Exception {
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    Document doc = builder.newDocument();
    Element rootElement = doc.createElement("Groups");
    doc.appendChild(rootElement);
    Element group = doc.createElement("Group");
    group.setTextContent("Wibble");
    rootElement.appendChild(group);
    DOMSource source = new DOMSource(doc);
    XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(source);
    reader.nextTag();
    System.out.println("NextTag:" + reader.getName());
}
预期的输出应该是这样的:NextTag:Groups但是抛出以下内容:
Exception in thread "main" javax.xml.stream.XMLStreamException: java.net.MalformedURLException
    at com.sun.xml.stream.XMLReaderImpl.setInputSource(XMLReaderImpl.java:196)
    at com.sun.xml.stream.XMLReaderImpl.<init>(XMLReaderImpl.java:179)
    at com.sun.xml.stream.ZephyrParserFactory.createXMLStreamReader(ZephyrParserFactory.java:139)
    at Main.main(Main.java:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.net.MalformedURLException …我有一个OMElement对象,我希望得到一个InputStream或一个读者对象.我想要的是xml从OMElement我拥有的流中流,而不是加载到内存中.我只能XMLStreamReader从那里获得对象.但我找不到办法InputStream/Reader摆脱这种局面.
OMElement element /*I have this object */
XMLStreamReader xmlreader = element.getXMLStreamReaderWithoutCaching();
谁能帮帮我吗 ?我真的很感激!
谢谢
PS:我已经找到了一个获取InputStream的方法,但它提供了一个异常,我需要帮助来解决它.
XMLStreamReader xmlReader = element.getXMLStreamReader(false);
  try {
      if (xmlReader.getEventType() == XMLStreamReader.START_DOCUMENT) {
                xmlReader.next();
       }
      DataHandler handler = XMLStreamReaderUtils.getDataHandlerFromElement(xmlReader);
      handler.getInputStream();
对getDataHandlerFromElement的调用生成异常javax.xml.stream.XMLStreamException:base64解码期间出错
如果我有一个 XML 元素,例如:
<title>this is a title</title>
使用 XMLStreamReader 很容易获得文本。getElementText(). 但是,如果遇到这样的元素,我无法弄清楚如何获取文本:
<title>this is a <othertag>title with another</othertag> tag inside of it</title>
我什至不确定那是否是有效的 XML,但它似乎通过了我试过的 W3C 验证器。根据API 文档,getElementText()如果您要在START_ELEMENT内部遇到另一个事件,则不能使用来获取文本。那么...可以使用?
让我们创建一个包含两个属性值的XML文件,其中包含一个扩展的unicode char
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(ERROR_XML), "UTF-8"))) {
XMLStreamWriter xmlStreamWriter = outputFactory.createXMLStreamWriter(writer);
xmlStreamWriter.writeStartDocument();
xmlStreamWriter.writeCharacters("\n");
xmlStreamWriter.writeStartElement("start");
xmlStreamWriter.writeAttribute("test1", "11");
xmlStreamWriter.writeAttribute("test2", "22");
xmlStreamWriter.writeEndElement();
xmlStreamWriter.writeEndDocument();
}
生成的文件如下所示:
<?xml version="1.0" ?>
<start test1="11" test2="22"></start>
如果再次读入并检查属性值
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(ERROR_XML), "UTF-8"))) {
XMLStreamReader xmlStreamReader = inputFactory.createXMLStreamReader(reader);
xmlStreamReader.nextTag();
if (XMLStreamReader.START_ELEMENT == xmlStreamReader.getEventType() &&
    "start".equals(xmlStreamReader.getLocalName())) 
{
    System.out.println(xmlStreamReader.getAttributeValue(0));
    System.out.println(xmlStreamReader.getAttributeValue(1));
}}
这将打印
11
22
令人惊讶的是,第二个属性值包含2次扩展的unicode char!
以下任何使用扩展char作为属性值都会增加此计数.在一个案例中,我收到了12000个相同字符的属性值,而不是一个.这里发生了什么?
我有一个我想阅读的Xml Stream XElement.我见过使用的样品,XmlTextReader但我需要它XElement.
我到目前为止的代码:
string url = 
 String.Format( "http://dev.virtualearth.net/REST/v1/Locations/{0}?o=xml&key={1}", HttpUtility.UrlEncode( AddressQuery ), mapkey );
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;  
XmlTextReader reader = new XmlTextReader( url );
我只是不确定如何让读者进入XElement.也许我会以错误的方式去做.
我有一些现有的代码可以解析顶级元素名称空间以确定我们正在查看哪种 XML 文件。
XMLEventReader reader = createXMLEventReader(...);
try {
    while (reader.hasNext()) {
        XMLEvent event = reader.nextEvent();
        switch (event.getEventType()) {
            case XMLStreamConstants.DTD:
                // No particularly useful information here?
                //((DTD) event).getDocumentTypeDeclaraion();
                break;
            case XMLStreamConstants.START_ELEMENT:
                formatInfo.qName = ((StartElement) event).getName();
                return formatInfo;
            default:
                break;
        }
    }
} finally {
    reader.close();
}
如果我允许解析器从 Web 加载 DTD,getDocumentTypeDeclaraion()则包含一个巨大的字符串,其中包含的信息比我知道如何处理的信息多,因为它在移交字符串之前将所有相关的 DTD 插入到该字符串中。另一方面,如果我阻止解析器从 Web 加载 DTD(出于显而易见的原因,无论如何这是更好的选择),它只会给我字符串"<!DOCTYPE".
有没有办法取回 DOCTYPE 内的值?
我正在使用 JRE 附带的默认解析器,以防万一。
我正在使用 JAXB 来解组 XML 文档。解析 XML 时,它会抛出用 XMLStreamException 包装的 MalformedURLException。我的理解是,在创建 XMLStreamReader 对象本身时,它会抛出异常。请问有什么建议吗?
我正在使用的代码片段:
    XMLInputFactory xif = XMLInputFactory.newFactory();      
    XMLResolver resolver = new XMLResolver(); //to capture systemID, base URI etc.
    xif.setXMLResolver(resolver);
    //Throws MalformedURLException  while processing the below line
    XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource(fileToProcess));
    JAXBContext jaxbContext = JAXBContext.newInstance(MyPackage.MyClassName.class);
这是异常跟踪:
     class javax.xml.stream.XMLStreamException
     javax.xml.stream.XMLStreamException: java.net.MalformedURLException: no protocol:       [XML_FILEPATH/XML_FILE_NAME]
fileToProcess是包含绝对路径的字符串,例如 /home/project/input/myproject.xml
运行时 JDK 是 1.7。我缺少任何签名/协议吗?
谢谢,巴斯卡
我有一个xml文件,我使用XMLStreamReader对象从中读取.所以我会保持简单:
我们来看看这个xml示例:
<mySample xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attribute1="value1"/>
所以我需要的是获取值(作为字符串)"xmlns:xsi"并获取值(也作为字符串)" http://www.w3.org/2001/XMLSchema-instance "
我确实试过这样的测试:
if (reader.getEventType() != XMLStreamConstants.NAMESPACE){
       attributeName = reader.getAttributeLocalName(i);
       attributeValue = reader.getAttributeValue(i);
}
else{
       attributeName = reader.getNamespacePrefix(i) + reader.getNamespaceURI(i);
       attributeValue = reader.getAttributeValue(i);
}
但它没有用.
显然我错过了这个API的新手,所以任何帮助都会非常受欢迎.