c ++中的Xpath查询(Xpath Query in c++)
我需要在C ++中使用xpath查询来直接从节点
<revisions>
获取idNumber
。 我尝试了以下内容,它总是返回null
。 请让我知道我做错了什么。xml文件:
<?xml version="1.0" encoding="UTF-8" ?> <cw:vessel version="1.07.0075" creationDate="2016-01-26" xmlns:cw="urn:container"> <!-- saved from url=(0024)http://www.systemsoftsol.com/ --> <Exchanger> <revisions> <revision> <idNumber>1401889476</idNumber> <revNumber>0</revNumber> <revDate>2014-06-04</revDate> <operator>devin</operator> <notes>read me</notes> </revision> </revisions> </Exchanger> </cw:vessel>
我的代码到目前为止:
void GetProperties() { HRESULT hr = NOERROR; CComPtr<::IXMLDOMDocument3> m_pxmlDomDocument = NULL; CComPtr<::IXMLDOMNode> pNode = NULL; IXMLDOMNodeList* pChildlist = NULL; VARIANT_BOOL vLoadBool = VARIANT_FALSE; hr = m_pxmlDomDocument.CoCreateInstance(__uuidof(DOMDocument60)); hr = m_pxmlDomDocument->setProperty(BSTR(L"SelectionLanguage"), (CComVariant)L"XPath"); hr = m_pxmlDomDocument->setProperty((CComBSTR)"MaxElementDepth", (CComVariant)INT_MAX); if (FAILED(hr)) { hr = ERROR_XML_PARSE_ERROR; } CComVariant varXmlFileName(_T("xmlfileinput")); m_pxmlDomDocument->load(varXmlFileName, &vLoadBool); hr = m_pxmlDomDocument->get_documentElement(&pDocRoot); hr = pDocRoot->selectSingleNode(_T("//Exchanger"), &pNode); pNode->get_childNodes(&pChildlist); long size; hr = pChildlist->get_length(&size); for (int i = 0; i < size; i++) { CComPtr<::IXMLDOMNode> referNode; hr = pChildlist->get_item(i, &referNode); if (referNode != NULL) { CString csXPathQuery; csXPathQuery.Append(_T("/idNumber"));// i need this from above xml CComBSTR csBstrQuery(csXPathQuery); CComPtr<::IXMLDOMNode> pPa; hr = referNode->selectSingleNode(csBstrQuery.m_str, &pPa); } } }
selectSingleNode()
在上面的代码片段中返回null
,即使我在xml文件中仍然有idNumber
。I need a xpath query in C++ to get the
idNumber
directly from the node<revisions>
. I tried the following and it always returnsnull
. Please let me know what I am doing wrong.xml File:
<?xml version="1.0" encoding="UTF-8" ?> <cw:vessel version="1.07.0075" creationDate="2016-01-26" xmlns:cw="urn:container"> <!-- saved from url=(0024)http://www.systemsoftsol.com/ --> <Exchanger> <revisions> <revision> <idNumber>1401889476</idNumber> <revNumber>0</revNumber> <revDate>2014-06-04</revDate> <operator>devin</operator> <notes>read me</notes> </revision> </revisions> </Exchanger> </cw:vessel>
My code so far:
void GetProperties() { HRESULT hr = NOERROR; CComPtr<::IXMLDOMDocument3> m_pxmlDomDocument = NULL; CComPtr<::IXMLDOMNode> pNode = NULL; IXMLDOMNodeList* pChildlist = NULL; VARIANT_BOOL vLoadBool = VARIANT_FALSE; hr = m_pxmlDomDocument.CoCreateInstance(__uuidof(DOMDocument60)); hr = m_pxmlDomDocument->setProperty(BSTR(L"SelectionLanguage"), (CComVariant)L"XPath"); hr = m_pxmlDomDocument->setProperty((CComBSTR)"MaxElementDepth", (CComVariant)INT_MAX); if (FAILED(hr)) { hr = ERROR_XML_PARSE_ERROR; } CComVariant varXmlFileName(_T("xmlfileinput")); m_pxmlDomDocument->load(varXmlFileName, &vLoadBool); hr = m_pxmlDomDocument->get_documentElement(&pDocRoot); hr = pDocRoot->selectSingleNode(_T("//Exchanger"), &pNode); pNode->get_childNodes(&pChildlist); long size; hr = pChildlist->get_length(&size); for (int i = 0; i < size; i++) { CComPtr<::IXMLDOMNode> referNode; hr = pChildlist->get_item(i, &referNode); if (referNode != NULL) { CString csXPathQuery; csXPathQuery.Append(_T("/idNumber"));// i need this from above xml CComBSTR csBstrQuery(csXPathQuery); CComPtr<::IXMLDOMNode> pPa; hr = referNode->selectSingleNode(csBstrQuery.m_str, &pPa); } } }
selectSingleNode()
returnsnull
in the above piece of code even though I still have theidNumber
in the xml file.
原文:https://stackoverflow.com/questions/35580202
最满意答案
我刚写了一些可能有帮助的代码。 这还没有使用任何scala DSL用于硒。
class EnrollTest extends FlatSpec with ShouldMatchers{ var driver = new FirefoxDriver driver.manage.timeouts.implicitlyWait(10, TimeUnit.SECONDS) val beginnersPage = BeginnersPage.open(driver) "Enroll button" should "open enroll page" in { try { val timeOfFirstCourse = beginnersPage.enrollForTheFirstCourse val enrollPage = new EnrollPage(driver) enrollPage.shouldBeOpen enrollPage.courseDetails should include(timeOfFirstCourse) } finally{ driver.quit } } }
和页面类:
object BeginnersPage{ val url = "http://"+System.getProperty("testUrl", "www.2ndlanguage.co.uk")+"/beginners.action" def open(driver : WebDriver) : BeginnersPage = { driver.get(url) new BeginnersPage(driver) } } class BeginnersPage(driver : WebDriver){ private var firstEnrollButton: WebElement = driver.findElement(By.xpath("//div[@class='newPriceBoxRight']/a/div")) private var firstCourseTime: WebElement = driver.findElement(By.xpath("//div[@class='newPriceBoxLeft']//span[@id='time']")) def enrollForTheFirstCourse : String = { val time = firstCourseTime.getText firstEnrollButton.click time } } class EnrollPage(driver : WebDriver){ def isOpen = driver.getCurrentUrl startsWith "http://www.2ndlanguage.co.uk/offer.action" def courseDetails = driver.findElement(By.id("courseDetailsTextArea")).getText }
I just wrote some code which might be of help. This isn't using any scala DSL for selenium yet.
class EnrollTest extends FlatSpec with ShouldMatchers{ var driver = new FirefoxDriver driver.manage.timeouts.implicitlyWait(10, TimeUnit.SECONDS) val beginnersPage = BeginnersPage.open(driver) "Enroll button" should "open enroll page" in { try { val timeOfFirstCourse = beginnersPage.enrollForTheFirstCourse val enrollPage = new EnrollPage(driver) enrollPage.shouldBeOpen enrollPage.courseDetails should include(timeOfFirstCourse) } finally{ driver.quit } } }
And the page classes:
object BeginnersPage{ val url = "http://"+System.getProperty("testUrl", "www.2ndlanguage.co.uk")+"/beginners.action" def open(driver : WebDriver) : BeginnersPage = { driver.get(url) new BeginnersPage(driver) } } class BeginnersPage(driver : WebDriver){ private var firstEnrollButton: WebElement = driver.findElement(By.xpath("//div[@class='newPriceBoxRight']/a/div")) private var firstCourseTime: WebElement = driver.findElement(By.xpath("//div[@class='newPriceBoxLeft']//span[@id='time']")) def enrollForTheFirstCourse : String = { val time = firstCourseTime.getText firstEnrollButton.click time } } class EnrollPage(driver : WebDriver){ def isOpen = driver.getCurrentUrl startsWith "http://www.2ndlanguage.co.uk/offer.action" def courseDetails = driver.findElement(By.id("courseDetailsTextArea")).getText }
相关问答
更多-
至少在Specs2.0中,您会在org.specs2.matcher.MustExpectable中找到must的定义 /** * This kind of expectable can be followed by the verb must to apply a matcher: * * `1 must beEqualTo(1)` * * For convenience, several mustMatcher methods have also been defined as short ...
-
我不认为有适用于所有匹配器的解决方案。 在这种情况下,您可以重复使用aka机器 def contain(expected: Expectable[String]): Matcher[String] = new Matcher[String] { def apply[S <: String](e: Expectable[S]): MatchResult[S] = result(e.value.contains(expected.value), s" ${e.value} contain ...
-
Specs和ScalaTest都是用户愉快的好工具,但是它们在几个方面有所不同。 您可能想要选择一个作为Scala中的主要测试工具,但不需要放弃另一个,因为您可以使用两者。 例如,如果您喜欢ScalaTest的FeatureSpec语法和规范的Mockito语法,则可以将两个jar文件放在类路径中并同时使用两者。 在这里,我将尝试捕捉我在ScalaTest和ScalaTest之间注意到的主要设计理念差异。 这些工具之间的主要哲学差异可能是规范是为行为驱动开发(BDD)设计的,而ScalaTest则更为通用。 ...
-
您需要为此添加一个隐式转换: import org.hamcrest._ import org.specs2.matcher.MustMatchers._ implicit def asSpecs2Matcher[T](hamcrest: org.hamcrest.TypeSafeMatcher[T]): org.specs2.matcher.Matcher[T] = { def koMessage(a: Any) = { val description = new Strin ...
-
我认为你使用的是错误的WithApplication导入。 使用这一个: import play.api.test.WithApplication I think you are using the wrong WithApplication import. Use this one: import play.api.test.WithApplication
-
目前,您可以使用一些小技巧。 如果您按照以下方式注释您的Specs2类: @RunWith(classOf[JUnitRunner]) 对于旧版本的specs2,这应该是: @RunWith(classOf[JUnitSuiteRunner]) Scala IDE可以通过弹出式菜单通过JUnit运行器运行它(详情请参阅此处 )。 我正在为Scala IDE开发一个Specs2插件(不过,很遗憾,我还没有真正找到时间,但它仍然在我的列表中)。 它有一个适用于以前版本Scala IDE的工作版本,但设置起来 ...
-
验收风格测试有利于使用Specs2进行单元样式测试?(Acceptance style testing in favour of unit style testing with Specs2?)[2022-03-14]
没有技术上的原因你不能使用“Acceptance”样式来编写单元测试,反之使用“Unit”样式来编写验收测试(因为你可以使用带代码折叠的编辑器来显示文本,或者你可以使用plan参数执行规范并获取规范的全文而无需执行示例)。 您需要注意的两个“技术”事项: “unit”规范使用变量来注册示例,因此如果您尝试使用不同的线程构建此类规范,则会遇到并发问题 “接受”规范使用示例的最后一个值作为结果。 所以,默认情况下,当你想在一个例子中每行写一个期望时,它就不太方便了。 要解决这个问题,您需要混合使用ThrownE ... -
我通过添加sequantial解决了这个问题。 I fixed this issue by adding sequantial.
-
硒,规格和斯卡拉(Selenium, specs and scala)[2022-04-26]
我刚写了一些可能有帮助的代码。 这还没有使用任何scala DSL用于硒。 class EnrollTest extends FlatSpec with ShouldMatchers{ var driver = new FirefoxDriver driver.manage.timeouts.implicitlyWait(10, TimeUnit.SECONDS) val beginnersPage = BeginnersPage.open(driver) "Enroll butto ... -
规格2,顺序与否(Specs2, sequential or not)[2023-01-04]
由于您使用模拟,最简单的方法是每个示例创建一个。 像这样,所有示例都是独立的,可以同时执行。 Since you are using a mock the easiest thing to do is to create one per example. Like this all the examples are independent and can be executed concurrently.