[英]What is the correct use of XmlNode.SelectSingleNode(string xpath) in C#?
我在處理一些XML文件時遇到了麻煩(這篇文章末尾)。
我編寫了以下代碼,以獲取與給定Job_Name
模式相關的Job_Id
數據,其所有者Job_Owner
是運行probram的用戶:
List<String> jobID = new List<String>();
XmlNodeList nodes = xml.SelectNodes("//Job");
foreach (XmlNode node in nodes)
{
innerNode = node.SelectSingleNode("//Job_Owner"); // SelectSingleNode here always selects the same node, but I thought it should be relative to node, not to nodes
if (!innerNode.InnerText.Contains(Environment.UserName))
{
continue;
}
innerNode = node.SelectSingleNode("//Job_Name");
if (!Regex.IsMatch(innerNode.InnerText, jobNamePattern, RegexOptions.Compiled))
{
continue;
}
innerNode = node.SelectSingleNode("//Job_Id");
jobID.Add(innerNode.InnerText);
}
我希望node.SelectSingleNode("//Job_Name")
只在node
表示的xml代碼下尋找名為Job_Name
的標簽。
這不是它似乎正在發生的事情,因為它總是返回相同的節點,無論它在foreach
哪一步都是無關緊要的(即從node
選擇的nodes
發生變化,但是node.SelectSingleNode("//Job_Name")
總是返回相同的內容)。
這段代碼有什么問題?
提前致謝!
-
XML文件如下所示:
<Data>
<Job>
<Job_Id>58282.minerva</Job_Id>
<Job_Name>sb_net4_L20_sType1</Job_Name>
<Job_Owner>mgirardis@minerva</Job_Owner>
<!--more tags-->
</Job>
<Job>
<!--etc etc etc-->
</Job>
<!--etc etc etc-->
</Data>
這是因為你在XPath中使用'//'語法。 該特定語法選擇名為that的文檔中的第一個節點。 嘗試查看https://www.w3schools.com/xml/xpath_syntax.asp以獲取有關XPath語法的信息。
如果您正在尋找子節點,請嘗試使用節點名稱(IE:'Job_Owner'而不是'// Job_Owner')
Infernex87是正確的, Job_Owner
對於這種情況簡單而有效。 但是,如果它不是直接的孩子,你可以這樣做:
.//Job_Owner
就像目錄一樣.
是當前節點,因此它查找當前節點的后代,而不是文檔的根。
Infernex87已經確定了原因。 按照你的XML,我想LINQ路線對你來說可能是一個不錯的選擇。 如果你想開始, Scott Gu的博客是一個很好的資源。
我們用maXbox腳本做了一個大的DOM / xML / SQL例程:
function GetXMLFromURLAdr_IsSame_All(apath: string): boolean; var xml, node: Olevariant; //IXMLDOMDocument; nodes_row, nodes_se, nodex: olevariant; i, j: Integer; sr1,sr2, basenod, basenod2, filePrefix, mySQL, odbcDSN, Auftrag: string; begin xml:= CreateOleObject('Microsoft.XMLDOM') as IXMLDocument; xml.async:= False; if xml.load(apath) then writeln('xml path load success2'); if xml.parseError.errorCode <> 0 then writeln('XML Load error:' + xml.parseError.reason); basenod:= '/WAB/Auftragsliste/Auftrag'; nodes_row:= xml.SelectNodes(basenod); writeln('total auftrag nodes: '+itoa(nodes_row.length)) try for j:= 0 to nodes_row.length-1 do begin //nodes_se:= nodes_row.item[j] node:= nodes_row.item[j]
// writeln(node.text) sr1:= node.selectSingleNode('.//Lieferanschrift/Ort').text sr1:= sr1 + node.selectSingleNode('.//Lieferanschrift/Strasse').text sr2:= node.selectSingleNode('.//Rechnungsanschrift/Ort').text; sr2:= sr2 + node.selectSingleNode('.//Rechnungsanschrift/Strasse').text; writeln(node.selectSingleNode('.//Auftragskopf/FremdlieferscheinNr').text); Auftrag:= node.selectSingleNode('.//Auftragskopf/FremdlieferscheinNr').text writeln(node.selectSingleNode('.//Auftragskopf/FremdlieferscheinNr').text);if ANSICompareText(sr1, sr2) = 0 then begin srlist:= FindAllFiles(PDFFILEPATH,'*'+Auftrag+'_??.pdf',true); for it:= 0 to srlist.count-1 do begin writeln((srlist.strings[it])); if lCopyFile(srlist.strings[it], PDFEXPORT+extractfilename(srlist.strings[it]),true) then writeln('copyof=: '+srlist.strings[it]); end; srlist.free; srlist:= Nil; it:=0; result:= true; end else begin srlist:= FindAllFiles(PDFFILEPATH,'*'+Auftrag+'*.pdf',true); for it:= 0 to srlist.count-1 do begin if lCopyFile(srlist.strings[it], PDFEXPORT+extractfilename(srlist.strings[it]),true) then writeln('copyof<>: '+srlist.strings[it]); end; DeleteFiles(PDFEXPORT, '*RG.pdf'); DeleteFile(PDFEXPORT+'Special_'+Auftrag+'_ES.pdf'); srlist.free; result:= false end; //mk change in op fileprefix:= 'WAB'; odbcDSN:= 'advance_kmu_loc'; if filePrefix='WAB' then begin mySQL:= 'UPDATE verk_auftrag SET Status = 61 where Auftrag = '+Auftrag; writeln('order back: '+ itoa(MySQLQueryExecute2(mysql, odbcDsn, strtoint(Auftrag),true))); end; if filePrefix='WEA' then begin mySQL:= 'UPDATE verk_auftrag SET Status = 52 where Auftrag = '+Auftrag; writeln('order back: '+ itoa(MySQLQueryExecute2(mysql, odbcDsn, strtoint(Auftrag),true))); end; } nodes_se:= node.selectNodes('.//Auftragspositionen/Position'); writeln('total posnod: '+itoa(nodes_se.length)) for i:= 0 to nodes_se.length - 1 do begin node:= nodes_se.item[i]; writeln('Posit=' + node.text); end;//} writeln('------------------------'); end; //} except writeln(exceptiontoString(exceptiontype, exceptionparam)) finally xml:= unassigned; xml:= NULL; end; end;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.