iPhone:在Key Field的基础上解析冗长的XML文件

时间:2009-10-05 11:52:20

标签: iphone xml search parsing

我想解析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相关的项

请建议

2 个答案:

答案 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"]以检索特定节点的子节点。