【问题标题】:iPhone : parse Lengthy XML file on the Base of Key FieldiPhone:基于关键字段解析冗长的 XML 文件
【发布时间】:2009-10-05 11:52:19
【问题描述】:

我想解析 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>

在上面的代码中,&lt;p&gt; 只有两个标签。但实际上有多个标签。我想搜索属性id 具有某些特定值(例如327)的特定标记。 所以一种方法是我从一开始就解析 XML 文件以获得所需的结果。是否有任何其他方法可以让我直接找到所需的标签。例如,如果我想在上面的 XML 中搜索 &lt;p&gt; 标签中的属性 id = 328,那么它不会解析 id = 327 并直接只返回与 id = 328 相关的那些项目

请推荐

【问题讨论】:

标签: iphone xml search parsing


【解决方案1】:

取决于您如何定义“解析”。 一种“快速而肮脏”(并且可能存在错误)的方法是首先使用正则表达式搜索(或自定义解析器)查找片段,然后将片段提供给真正的 XML 解析器。我不知道有什么可以为你做这件事的,你必须自己动手。我建议这不是要走的路。

下一个层次是通过一个类似 SAX 的解析器(NSXMLParser 是它的一种形式)来提供它。 在

元素的处理程序中,检查 id 属性,如果它与您的值(或值)匹配,则设置一个标志以指示是否应解释子元素。 在您的子元素处理程序中,只需先检查该标志(当然,在原始 NSXMLParser 处理程序中,所有元素都会转到相同的方法)。

所以 NSXMLParser 确实会解析整个文档 - 但只是做最少的工作来建立正确的 XML 解析器上下文。处理元素的实际工作将推迟到满足值。如果没有像正则表达式建议这样的骇人听闻的东西,我看不到任何解决方法。

如果开销太大,我会重新考虑 XML 是否适合您的序列化格式(假设您对此有任何控制权)?

如果你坚持使用 NSXMLParser,my blog article here 至少可能有助于让体验更好。

【讨论】:

    【解决方案2】:

    libxml2 库可以使用following extensions 接收 XPath 查询。使用这些扩展,您可以发出 XPath 查询 /p[@id = "328"] 来检索该特定节点的子节点。

    【讨论】:

    • 这仍然会解析整个文档,但不会(至少在所需节点之前)
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多