我想解析xml文件。 xml文件结构如下
<?xml version="1.0" encoding="utf-8"?>
<Level>
<p id='327'>
<Item>
<Id>5877</Id>
<Type>0</Type>
<Icon>---</Icon>
<Title>Btn1Item1</Title>
</Item>
<Item>
<Id>5925</Id>
<Type>0</Type>
<Icon>---</Icon>
<Title>Btn1Item4</Title>
</Item>
</p>
<p id='328'>
<Item>
<Id>5878</Id>
<Type>0</Type>
<Icon>---</Icon>
<Title>Btn2Item1</Title>
</Item>
<Item>
<Id>5926</Id>
<Type>0</Type>
<Icon>---</Icon>
<Title>Btn2Item4</Title>
</Item>
</p>
</Level>
在上面的代码中,<p>
只有2个标记。但实际上有多个标签。我想搜索属性id
具有某个特定值(比如327)的特定标记。
所以一种方法是我从开始解析XML文件以获得所需的结果。是否有任何其他方法可以直接找到所需的标签。例如,如果我想在上面的XML中搜索属性id = 328的<p>
标签,那么它不会解析id = 327并且直接返回那些与id = 328相关的项
请建议
答案 0 :(得分:0)
取决于你如何定义“解析”。 “快速和肮脏”(并且可能有错误)的方法是首先使用正则表达式搜索(或自定义解析器)找到片段,然后将片段提供给真正的XML解析器。我不知道有什么能为你做这件事,你必须自己动手。我建议不要这样做。
下一个级别是通过类似SAX的解析器(NSXMLParser是一种形式)来提供它。 在&lt; p&gt;的处理程序中如果要检查id属性,如果它与您的值(或值)匹配,请设置一个标志以指示是否应该解释子元素。 在你的子元素处理程序中,首先检查该标志(当然,在原始NSXMLParser处理程序中,所有元素都将转到相同的方法)。
所以NSXMLParser确实会解析整个文档 - 但只是为了完成最小的工作来建立正确的XML解析器上下文。处理元素的实际工作将推迟到达到该值。如果没有像正则表达式那样的hacky,我没有看到任何方法。
如果这是太多的开销,我会重新考虑XML是否是适合您的序列化格式(假设您对此有任何控制权)?
如果您坚持使用NSXMLParser,my blog article here可能有助于至少提升体验。
答案 1 :(得分:0)
libxml2
库可以使用following extensions接收XPath查询。使用这些扩展,您可以发出XPath查询/p[@id = "328"]
以检索特定节点的子节点。