Tag: xml parsing

为什么STAX解析器认为这是有效的XML 1.0而不是1.1?

在下面的代码示例中,我使用STaX解析器来解析一段XML。 如果我通过它运行xml10,它按预期工作。 xml11字符串(除了xml版本之外是相同的) – 它会抛出NullPointerException。 我在使用JDK 1.6的Mac上运行它。 import javax.xml.namespace.QName; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.StringReader; import java.util.Stack; /** */ public class StaxSucks { static String xml10 =”\n”+ “”; static String xml11 =”\n”+ “”; static void parse(InputStream is) throws Exception{ final XMLInputFactory factory = XMLInputFactory.newInstance(); factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); final XMLStreamReader xmlStreamReader […]

使用DOM解析器解析XML中的属性

我目前正在解析XML,但我不太确定如何解析“message”的“status”属性: sometext stuff 这是代码,我已经切断了一切不必要的东西: NodeList nodeLst = doc.getElementsByTagName(“message”); for (int s = 0; s < nodeLst.getLength(); s++) { Node fstNode = nodeLst.item(s); if (fstNode.getNodeType() == Node.ELEMENT_NODE) { Element fstElmnt = (Element) fstNode; NodeList numberNmElmntLst = fstElmnt .getElementsByTagName("msisdn"); Element numberNmElmnt = (Element) numberNmElmntLst.item(0); NodeList numberNm = numberNmElmnt.getChildNodes(); String phoneNumber = ((Node) numberNm.item(0)) .getNodeValue().substring(2); NodeList txtNmElmntLst = […]

getChildNodes给出了意想不到的结果

我的XML看起来像这样 – ValueGoesHere 我正在使用以下代码处理它 – Document dom = parser.getDocument(); NodeList collected_objects = dom.getElementsByTagName(“object”); System.out.println(“Number of collected objects are ” + collected_objects.getLength()); for (int i = 0; i < collected_objects.getLength(); i++) { Node aNode = collected_objects.item(i); //get children of "objects" NodeList refNodes = aNode.getChildNodes(); System.out.println("# of chidren are " + refNodes.getLength()); //print attributes of "objects" NamedNodeMap […]

使用jsoup解析XML – 防止jsoup“清理”标记

在大多数情况下,使用jsoup解析XML没有问题。 但是,如果XML文档中有标记,jsoup会some text here将some text here更改为some text here 。 这使得无法使用CSS选择器在标记内提取文本。 那么如何防止jsoup“清理” 标签?

如何在Java中解析大(50 GB)XML文件

目前我试图使用SAX Parser,但是大约3/4通过文件它只是完全冻结,我已经尝试分配更多的内存等但没有得到任何改进。 有什么方法可以加快速度吗? 一个更好的方法? 将它剥离到裸骨,所以我现在有以下代码,当在命令行中运行时,它仍然没有我想要的那么快。 使用“java -Xms-4096m -Xmx8192m -jar reader.jar”运行它我得到的GC开销限制超出了文章700000 主要: public class Read { public static void main(String[] args) { pages = XMLManager.getPages(); } } XMLManager public class XMLManager { public static ArrayList getPages() { ArrayList pages = null; SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser parser = factory.newSAXParser(); File file = new File(“..\\enwiki-20140811-pages-articles.xml”); […]

在不改变XML的情况下,在Java中解析包含HTML实体的XML文件

我必须用Java解析一堆XML文件,有时 – 并且无效地 – 包含HTML实体,例如— , > 等等。 我理解处理这个问题的正确方法是在解析之前向XML文件添加合适的实体声明。 但是,我无法做到这一点,因为我无法控制这些XML文件。 是否有某种我可以覆盖的回调,只要Java XML解析器遇到这样的实体就会调用它? 我无法在API中找到一个。 我想用: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = dbf.newDocumentBuilder(); Document doc = parser.parse( stream ); 我发现我可以覆盖org.xml.sax.helpers.DefaultHandler resolveEntity ,但是如何在更高级别的API中使用它? 这是一个完整的例子: public class Main { public static void main( String [] args ) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = dbf.newDocumentBuilder(); […]

Java XML解析:避免实体引用解析

我目前正在使用DOM解析器解析XHTML文档,例如: final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(false); final DocumentBuilder db = dbf.newDocumentBuilder(); db.setEntityResolver(MY_ENTITY_RESOLVER); db.setErrorHandler(MY_ERROR_HANDLER); … final Document doc = db.parse(inputSource); 我的问题是当我的文档包含实体引用时,例如: € 我的解析器为该内容创建一个Text节点,其中包含“€”而不是“&euro;”。 也就是说,它正在以它应该的方式解析实体(XHTML 1.0 Strict DTD链接到ENTITIES Latin1 DTD,后者又建立了“&euro;”与“€”的等价性)。 问题是,我不希望解析器做这样的事情。 我想保留“&euro;” 文本未经修改 。 我已经尝试过了: final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false); 但: 我不喜欢这个,因为我担心这可能会使一些解析器实现无法从XHTML 1.0 Strict DTD 导航到ENTITIES Latin1 DTD,因此不考虑“&euro;” 作为声明的实体。 当我这样做时,它奇怪地创建了两个节点:一个“磅”实体节点,以及一个带有“€”符号的Text节点。 有任何想法吗? 是否有可能在DOM Parser中配置它而不需要预处理 XHTML并用所有“&”符号代替其他东西?… 解决方案可以是DOM解析器,也可以是SAX解析器,我不介意使用SAX解析,然后使用转换创建我的DOM […]

如何让SAX解析器从xml声明中确定编码?

我正在尝试解析来自不同来源的xml文件(我无法控制)。 其中大多数都是用UTF-8编码的,并且使用以下代码段不会导致任何问题: SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); FeedHandler handler = new FeedHandler(); InputSource is = new InputSource(getInputStream()); parser.parse(is, handler); 由于SAX默认为UTF-8,这很好。 但是有些文件声明: 即使声明ISO-8859-1 SAX仍然默认为UTF-8。 只有我添加: is.setEncoding(“ISO-8859-1”); SAX会使用正确的编码吗? 如何在没有专门设置的情况下让SAX自动检测xml声明中的正确编码? 我需要这个,因为我事先不知道文件的编码是什么。 艾琳,提前谢谢

在java-8中解组xml时出错“安全处理org.xml.sax.SAXNotRecognizedException导致java.lang.IllegalStateException”

以下代码在Java 7中运行良好 import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; String xmlString = ‘<xml ….. '; StringReader reader = new StringReader(xmlString); JAXBContext jc = JAXBContext.newInstance(MyClass.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); MyClass myClass = (MyClass) unmarshaller.unmarshal(reader); …. 现在我们不得不升级到Java 8,现在我在执行代码时遇到了这个exception: Sep 03, 2014 1:42:47 PM com.sun.xml.internal.bind.v2.util.XmlFactory createParserFactory SCHWERWIEGEND: null org.xml.sax.SAXNotRecognizedException: Feature: http://javax.xml.XMLConstants/feature/secure-processing at org.apache.xerces.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:100) at com.sun.xml.internal.bind.v2.util.XmlFactory.createParserFactory(XmlFactory.java:114) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.getXMLReader(UnmarshallerImpl.java:139) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157) […]

SAX解析和特殊字符

我想使用SAX解析器从xml文件解析一些数据。 我的xml如下: Pies & past Fruits 为了解析这些数据,我扩展了DefaultHandler。 解析后的输出是: cat 1 = Pies cat 2 = & cat 3 = past cat 4 = Fruits 为什么会发生这种情况而不是: cat 1 = Pies & past cat 2 = Fruits