我的XSLT中有两个场景:
<xsl:template match="/para/item"></xsl:template>
Run Code Online (Sandbox Code Playgroud)
和
<xsl:template match="para/item"></xsl:template>
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别?
我正在尝试读取一个看起来像的XML文件,
<?xml version="1.0" encoding="UTF-8"?>
<MyXML>
<SESSION FORM_ID="775938" CID="" ID="HAKKI-LAPTOP_634975758376381105">
<FIELD NAME="A001DATE_M" Y="2.32" X="5.5" WIDTH="7.15" HEIGHT="0.99">First Value</FIELD>
<FIELD NAME="A002" Y="2.32" X="17.83" WIDTH="2.38" HEIGHT="0.99">Second Value</FIELD>
<FIELD NAME="A003" Y="1.11" X="17.83" WIDTH="2.38" HEIGHT="0.99">Third Value</FIELD>
<FIELD NAME="A004" Y="1.11" X="5.5" WIDTH="2.38" HEIGHT="0.99">Fourth Value</FIELD>
</SESSION>
</MyXML>
Run Code Online (Sandbox Code Playgroud)
我试图读取读取的第三个值.我的代码可以检索第一个值.
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(sXMLPath);
XmlNode node = xmlDoc.SelectSingleNode("MyXML/SESSION/FIELD");
if (node != null)
{
MessageBox.Show(node.InnerText);
}
Run Code Online (Sandbox Code Playgroud)
为了读取第三个或第四个值,我需要做出哪些更改?
解决方案:(由@DGibbs提供)
XDocument xml = XDocument.Load(sXMLPath);
var elem = (from n in xml.Descendants("FIELD")
where n.Attribute("NAME").Value == "A004"
select n).FirstOrDefault();
MessageBox.Show(elem.Value);
Run Code Online (Sandbox Code Playgroud) 只是为了澄清,我正在使用XSLT 1.0.很抱歉没有首先指定.
我有一个XSLT样式表,我想将双引号替换为可安全进入JSON字符串的安全.我正在尝试做类似以下的事情:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/message">
<xsl:variable name="body"><xsl:value-of select="body"/></xsl:variable>
{
"message" :
{
"body": "<xsl:value-of select="normalize-space($body)"/>"
}
}
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
如果我传入的XML看起来如下所示,这将始终正常工作:
<message>
<body>This is a normal string that will not give you any issues</body>
</message>
Run Code Online (Sandbox Code Playgroud)
但是,我正在处理一个包含完整HTML的主体,这不是问题,因为它normalize-space()会处理HTML,而不是双引号.这打破了我:
<message>
<body>And so he quoted: "I will break him". The end.</body>
</message>
Run Code Online (Sandbox Code Playgroud)
我真的不在乎双引号是HTML转义还是带反斜杠的前缀.我只需要确保最终结果通过JSON解析器.
此输出传递JSON Lint并且是适当的解决方案(反斜杠引号):
{ "body" : "And so he quoted: \"I will break him\". The end." }
Run Code Online (Sandbox Code Playgroud) 由于SQL Server不支持follow-sibling轴 - 获取它的最佳方法是什么?假设我有这样的XML,我希望在节点匹配值'dog'后获得第一个'b'节点:
<root>
<a>cat</a>
<b>Cats don't like milk</b>
<a>dog</a>
<b>Dogs like everything</b>
</root>
Run Code Online (Sandbox Code Playgroud) 如何使用XML :: LibXML模块的findnodes()函数在XPath表达式中使用Perl变量?这就是我得到的:
my $variable = 1;
foreach my $node1 ($doc->findnodes('par/par1/par2[@id = $variable]'))
{
}
Run Code Online (Sandbox Code Playgroud)
但它似乎没有用.谢谢.
我试图在页面上找到一个特定的元素,但无法弄清楚要使用的正确的Xpath.
这是HTML(请注意每个div的位置可能会有所不同):
<div>
<label>First Name</label>
<span class="metadataField metadataFieldReadonly">
<input type="text" name="some-random-value" value="John">
</span>
</div>
<div>
<label>Last Name</label>
<span class="metadataField metadataFieldReadonly">
<input type="text" name="some-random-value" value="Smith">
</span>
</div>
Run Code Online (Sandbox Code Playgroud)
所以我试图在具有// div/label [text()='Last Name'的同一div中找到// div/span [@ class ='metadataField metadataFieldReadonly'] /输入的INPUT元素]
我可以用这个成功找到标签(使用JAVA):
driver.findElement(By.xpath("//div/label[text()='Last Name']")).click();
Run Code Online (Sandbox Code Playgroud)
我可以成功找到第一个元素下的第一个输入(但我可能并不总是想要第一个元素):
driver.findElement(By.xpath("//div/span[@class='metadataField metadataFieldReadonly']/input")).click();
Run Code Online (Sandbox Code Playgroud)
所以问题是(i)INPUT的名称标签和值总是不同,所以它们不能用来挑选元素,而(ii)带有姓氏标签的div可能并不总是第二个,而且( iii)标签和跨度是相同级别(兄弟姐妹)所以我无法弄清楚如何正确创建Xpath语句.
所以在单词中,我需要在同一个div中找到span的输入,其中包含一个带有"Last Name"的标签.
所以我需要知道如何将这两个XPath语句组合成一个复杂的语句(假设它们在同一个div中,并且标签和span是兄弟姐妹):
//div/label[text()='Last Name']
//div/span[@class='metadataField metadataFieldReadonly']/input
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一个XML文件,其中包含大量不需要/不需要的数据,我想使用XSLT进行清理
这是一小段数据,带有示例空节点
<?xml version="1.0" encoding="utf-8"?>
<Report xsi:schemaLocation="xxx">
<Tablix3>
<Tablix13 Textbox1164="TAX SUMMARY" Textbox10="">
<table26 textbox155="code">
<Detail_Collection>
<Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
<Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
<Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
<Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
<Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
<Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
<Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
<Detail textbox198="" …Run Code Online (Sandbox Code Playgroud) driver.findElement(By.xpath("//input[@type="+"checkbox"+"]/following-sibling:://td[contains(text(),"+"template"+"]"))
Run Code Online (Sandbox Code Playgroud)
我的HTML就像这样
<tr>
<td class="tablecontent">
<input type="checkbox" value="59781" name="templateIds">
</td>`enter code here`
<td class="tablecontent"> test11 </td>
</tr>
Run Code Online (Sandbox Code Playgroud)
org.openqa.selenium.InvalidSelectorException:给定的选择器//输入[@type = checkbox]/following-sibling :: // td [contains(text(),template]无效或不会产生WebElement.发生以下错误:InvalidSelectorError:由于以下错误,无法找到具有xpath表达式的元素//输入[@type = checkbox]/following-sibling :: // td [contains(text(),template]:[Exception] ..."表达式不是合法表达式."代码:"12"nsresult:"0x805b0033(SyntaxError)"location:"file:/// C:/ Users/sanjdash/AppData/Local/Temp/anonymous3529970525380845680webdriver-profile /extensions/fxdriver@googlecode.com/components/driver_component.js行:5956"]命令持续时间或超时:72毫秒有关此错误的文档,请访问: http://seleniumhq.org/exceptions/invalid_selector_exception.html构建信息:版本:'2.37.0',修订版:'a7c61cbd68657e133ae96672cf995890bad2ee42',时间:'2013-10-18 09:51:02'
所以我<a>在xml文件中有这个标签
<a href="/www.somethinggggg.com">Something 123</a>
Run Code Online (Sandbox Code Playgroud)
我想要的结果是使用Nokogiri并完全删除它的标签,因此它不再是可点击的链接,例如
Something 123
Run Code Online (Sandbox Code Playgroud)
我的尝试:
content = Nokogiri::XML.fragment(page_content)
content.search('.//a').remove
Run Code Online (Sandbox Code Playgroud)
但这也删除了文本.
有关如何使用Nokogiri实现我想要的结果的任何建议?
我正在用Scrapy编写一个网络爬虫来下载某个网页上的回复文本.
以下是网页背后代码的相关部分,用于特定的对讲:
<div id="site_comment_71339" class="site_comment site_comment-even large high-rank">
<div class="talkback-topic">
<a class="show-comment" data-ajax-url="/comments/71339.js?counter=97&num=57" href="/comments/71339?counter=97&num=57">57. talk back title here </a>
</div>
<div class="talkback-message"> blah blah blah talk-back message here </div>
....etc etc etc ......
Run Code Online (Sandbox Code Playgroud)
在编写XPath以获取消息时:
titles = hxs.xpath("//div[@class='site_comment site_comment-even large high-rank']")
Run Code Online (Sandbox Code Playgroud)
后来:
item["title"] = titles.xpath("div[@class='talkback-message']text()").extract()
Run Code Online (Sandbox Code Playgroud)
没有错误,但它不起作用.有什么想法吗?我想我没有正确编写路径,但我找不到错误.
谢谢 :)
整个代码:
from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from craigslist_sample.items import CraigslistSampleItem
class MySpider(BaseSpider):
name = "craig"
allowed_domains = ["tbk.co.il"]
start_urls = ["http://www.tbk.co.il/tag/%D7%91%D7%A0%D7%99%D7%9E%D7%99%D7%9F_%D7%A0%D7%AA%D7%A0%D7%99%D7%94%D7%95/talkbacks"]
def parse(self, response):
hxs = Selector(response)
titles = hxs.xpath("//div[@class='site_comment …Run Code Online (Sandbox Code Playgroud) xpath ×10
xml ×5
xslt ×3
java ×2
selenium ×2
c# ×1
json ×1
nokogiri ×1
perl ×1
ruby ×1
scrapy ×1
sql-server ×1
web-crawler ×1
web-scraping ×1
xml-libxml ×1
xml-parsing ×1