在iOS中使用touchXML的XPath问题
我想使用touchXML解析ios中的xhtml文件。我正在尝试第一次。我在XHTML中有以下格式:在iOS中使用touchXML的XPath问题
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="en">
<head>
<meta http-equiv="default-style" content="text/html; charset=utf-8"/>
<title>Contents</title>
<link rel="stylesheet" href="css/igp-widget-world.css" type="text/css"/>
</head>
<body>
<nav epub:type="toc"><h2>Contents</h2>
<ol epub:type="list">
<li><a href="s001-BookTitlePage-01.xhtml">Widget World</a></li>
<li><a href="s002-Copyright-01.xhtml">Copyright</a></li>
<li><a href="s003-TableOfContents-01.xhtml">Contents</a></li>
<li><a href="s004-Introduction-01.xhtml">Introduction</a></li>
<li><a href="s005-Part-001.xhtml">PART 1: EVENTS AND COMMANDS</a></li>
<li><a href="s006-Topic-001.xhtml">1: Timeline Events</a></li>
<li><a href="s007-Topic-002.xhtml">2: Counter Events</a></li>
<li><a href="s008-Topic-003.xhtml">3: Sprite Events</a></li>
<li><a href="s009-Part-002.xhtml">PART 2: QUESTIONS AND ANSWERS</a></li>
<li><a href="s010-Topic-004.xhtml">4: QAA True-False</a></li>
<li><a href="s011-Topic-005.xhtml">5: QAA True-False Multi</a></li>
<li><a href="s012-Topic-006.xhtml">6: QAA-Multichoice</a></li>
<li><a href="s013-Topic-007.xhtml">7: QAA Multi-Response</a></li>
<li><a href="s014-Topic-008.xhtml">8: QAA Association</a></li>
<li><a href="s015-Topic-009.xhtml">9: QAA Sequence</a></li>
<li><a href="s016-Topic-010.xhtml">10: QAA-Textmatch</a></li>
<li><a href="s017-Topic-011.xhtml">11: QAA-Textmatch Multi</a></li>
<li><a href="s018-Topic-012.xhtml">12: QAA Sort Word</a></li>
<li><a href="s019-Topic-013.xhtml">13: QAA Set</a></li>
<li><a href="s020-Part-003.xhtml">PART 3: INTERACTIVE WIDGETS</a></li>
<li><a href="s021-Topic-014.xhtml">14: Widgets: Horizontal Sliding Panel</a></li>
<li><a href="s022-Topic-015.xhtml">15: Widgets: Vertical Sliding Panel</a></li>
<li><a href="s023-Topic-016.xhtml">16: Widgets: Horizontal Tutorial Panel</a></li>
<li><a href="s024-Topic-017.xhtml">17: Widgets: Vertical Tutorial Panel</a></li>
<li><a href="s025-Topic-018.xhtml">18: Widgets: Vertical Scrolling Panel</a></li>
<li><a href="s026-Topic-019.xhtml">19: Widgets: Horizontal Scrolling Panel</a></li>
<li><a href="s027-Topic-020.xhtml">20: Widgets: XY Scrolling Panel</a></li>
<li><a href="s028-Topic-021.xhtml">21: Widgets: Locked Panel</a></li>
<li><a href="s029-Topic-022.xhtml">22: Widgets: Popups</a></li>
<li><a href="s030-Topic-023.xhtml">23: Widgets: Reveal</a></li>
<li><a href="s031-Topic-024.xhtml">24: Widgets: PopUp Panel</a></li>
<li><a href="s032-Colophon-01.xhtml">Colophon</a></li>
</ol>
</nav>
</body>
</html>
这是我的xhtml文件。我实现如下:
CXMLDocument* xmlDoc = [[CXMLDocument alloc] initWithContentsOfURL:myURL options:0 error:nil];
NSString* xpath = [NSString stringWithFormat:@"//html:a[contains(@href,'%@')]/../html:a", myValue];
NSArray* navPoints = [ncxToc nodesForXPath:xpath namespaceMappings:[NSDictionary dictionaryWithObject:@"http://www.w3.org/1999/xhtml/" forKey:@"xhtml"] error:nil];
我试图找到<a>
其中<a href =
我的价值的价值。
我不知道我在哪里错了错误的是:
XPath error : Undefined namespace prefix
XPath error : Invalid expression
比我改变了的XPath如下:
NSString* xpath = [NSString stringWithFormat:@"//html/a[contains(@href,'%@')]/../html/a", myValue];
:
取代/
。它不会像上面那样给我提供错误,但也不会获得我的内容。
我不知道XPATH。在XML中,我只知道NSXMLParser
。请帮我确定这是什么问题?
更新
随着我到现在我更新了我的代码,做了如下的回答:
NSString* xpath = [NSString stringWithFormat:@"//html:a[@href = '%@']", href];
NSArray* navPoints = [ncxToc nodesForXPath:xpath namespaceMappings:[NSDictionary dictionaryWithObject:@"http://www.w3.org/1999/xhtml/" forKey:@"html"] error:nil];
和
NSString* xpath = [NSString stringWithFormat:@"//xhtml:a[@href = '%@']", href];
NSArray* navPoints = [ncxToc nodesForXPath:xpath namespaceMappings:[NSDictionary dictionaryWithObject:@"http://www.w3.org/1999/xhtml/" forKey:@"xhtml"] error:nil];
没有错误,但我得到任何数组中的对象。我不认为我的XPath正在工作。
更新2
我得到的XPath是如下:
//xhtml:a[@href = 's001-BookTitlePage-01.xhtml']
or
//html:a[@href = 's001-BookTitlePage-01.xhtml']
还当我尝试了XPath的,如://html:a
尽管我没有得到所有锚标签。
**更新3 **
我试图检查的XPath在线http://www.xpathtester.com/test
我发现下面的错误在我的XPath //html:a
Exception occurred evaluting XPath: //html:a. Exception: XPath expression uses unbound namespace prefix html
不知道是什么意思。
感谢
//a[@href="s001-Cover-01.xhtml"]/text()
回报“盖” 但您的文档格式不正确:<body>
没有关闭
不工作..我不'navPoints'使用此XPath甚至 –
Actualy如果去掉'的xmlns =“http://www.w3.org/1999/xhtml”'解析开始工作得到任何价值。我想知道它是如何修复的... –
您注册了命名空间“XHTML”,但在查询中使用前缀“HTML”。
代码注册的命名空间:
NSArray* navPoints = [ncxToc nodesForXPath:xpath namespaceMappings:[NSDictionary dictionaryWithObject:@"http://www.w3.org/1999/xhtml/" forKey:@"xhtml"] error:nil];
你的XPath查询:
//html:a[contains(@href,'%@')]/../html:a
更改两条线之一,以适应前缀:
//xhtml:a[contains(@href,'%@')]/../xhtml:a
无论如何,你应该剥离返回到列表项的最后两个轴步骤并再次查找锚点元素。如果列表项中有两个锚点元素(直接),则只有两个锚点元素与@href
属性匹配。此外,你写的,你想,如果他们相等比较,所以没有必要contain()
如果他们真的等于:
//xhtml:a[@href = '%@']
感谢您的回答。请在您的回复后查看我提出的问题。 –
“但我得到了阵列中的任何对象。” - 你忘了“不”吗?你能打印'xpath'变量,所以我们知道它构造正确吗?如果您忽略整个谓词来获取所有锚标记,会发生什么? –
我再次更新了问题。 –
没有重复,只是意识到注册是对下面的XPath表达式的命名空间,我没”不要期待它。 –