使用TouchXML解析多个和多级嵌套元素

Mit*_*hin 0 iphone touchxml

我有一个具有以下结构的XML,我正在尝试从此创建我的模型对象.有人可以帮我找到一种方法,使用TouchXML,NSMutableArray和NSMutableDictionay从XML中获取这些对象.

<?xml version="1.0" encoding="utf-8"?>
<response>
  <level1_items>
    <level1_item>
      <item_1>text</item_1>
      <item_2>text</item_2>
    </level1_item>
    <level1_item>
      <item_1>some text</item_1>
      <item_2>some more text</item_2>
  </level1_items>
  <items>
    <item>
      <child_items>
        <child_item>
          <leaf1>node text</leaf1>
          <leaf2>leaf text</leaf2>
          <leaf3>some text</leaf3>
        </child_item>
        <child_item>
          <leaf1>text</leaf1>
          <leaf2>leaf text</leaf2>
          <leaf3>more text</leaf3>
        </child_item>
      </child_items>
    </item>
    <item>
      <child_items>
        <child_item>
          <leaf1>node text</leaf1>
          <leaf2>leaf text</leaf2>
          <leaf3>some text</leaf3>
        </child_item>
        <child_item>
          <leaf1>text</leaf1>
          <leaf2>leaf text</leaf2>
          <leaf3>more text</leaf3>
        </child_item>
      </child_items>
    </item>
  </items>
</response>
Run Code Online (Sandbox Code Playgroud)

我需要解析它<response>和它的孩子.

Mat*_*ong 6

首先,我不得不说你的XML很难处理,因为你试图为列表中的每个项目使用特定的标记.例如:

  <level1_items>
    <level1_item>
      <item_1>text</item_1>
      <item_2>text</item_2>
    </level1_item>
    <level1_item>
      <item_1>some text</item_1>
      <item_2>some more text</item_2>
  </level1_items>
Run Code Online (Sandbox Code Playgroud)

名为<item_ 1>,<item_ 2>的标签没有意​​义,因为XML旨在描述您的数据,而不是定义它.如果你有一个实体,称为一个项目,你应该叫它项目,使XML是这样的:

  <level1_items>
    <level1_item>
      <item index="1">text</item>
      <item index="2">text</item>
    </level1_item>
    <level1_item>
      <item index="1">some text</item>
      <item index="2">some more text</item>
  </level1_items>
Run Code Online (Sandbox Code Playgroud)

每个项目都有一个索引.就此而言,您可以在TouchXML CXMLDocument中加载文档并使用XPath获取所需的节点,并假设它们的顺序正确,忽略了我指定的index =参数.

下一个问题是将XML转换为NSDictioanry或NSArray的词典是一项非常复杂的任务,你获得的是不值得的.只需将XML加载到CXMLDocument中,然后使用XPath开始获取节点.像这样的东西:

CXMLDocument *doc = [[CXMLDocument alloc] initWithXMLString:xmlString options:0 error:nil];

// Returns all 'level1_item' nodes in an array    
NSArray *nodes = [[doc rootElement] nodesForXPath:@"//response/level1_items/level1_item" error:nil];

for (CXMLNode *itemNode in nodes)
{
    for (CXMLNode *childNode in [itemNode children])
    {
        NSString *nodeName = [childNode name]; // should contain item_1 in first iteration
        NSString *nodeValue = [childNode stringValue]; // should contain 'text' in first iteration
        // Do something with the node data.

    }
}
Run Code Online (Sandbox Code Playgroud)

我建议尝试以这种方式使用XML,然后回到这里并在遇到问题时询问具体问题.