簡體   English   中英

在C#中正確使用XmlNode.SelectSingleNode(string xpath)是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM