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

时间:2011-10-07 21:18:53

标签: c# xml .net-3.5 xpath

我在处理某些XML文件时遇到了问题(本文末尾)。

我编写了以下代码,以获取与所有Job_Id模式相关的Job_Name数据,其所有者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")仅在Job_Name所代表的xml代码下寻找名为node的标记。

这不是它似乎正在发生的事情,因为它总是返回相同的节点,在它foreach的哪一步无关紧要(即从{{node中选择nodes 1}}更改,但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>

4 个答案:

答案 0 :(得分:22)

这是因为你在XPath中使用'//'语法。该特定语法选择名为that的文档中的第一个节点。尝试查看https://www.w3schools.com/xml/xpath_syntax.asp以获取有关XPath语法的信息。

如果您正在寻找子节点,请尝试使用节点名称(IE:'Job_Owner'而不是'// Job_Owner')

答案 1 :(得分:18)

Infernex87是正确的Job_Owner对于这种情况简单有效。但是,如果它不是直接的孩子,你可以这样做:

.//Job_Owner

就像目录一样,.是当前节点,因此它会查找当前节点的后代,而不是文档的根。

答案 2 :(得分:1)

Infernex87已经确定了原因。按照你的XML,我想LINQ路线对你来说可能是一个不错的选择。如果你想开始,Scott Gu's blog是一个很好的资源。

答案 3 :(得分:0)

我们用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;

相关问题