web-dev-qa-db-ja.com

C#でのXmlNode.SelectSingleNode(string xpath)の正しい使用は何ですか?

XMLファイル(この投稿の最後にあります)の処理に問題があります。

所有者_Job_Id_がprobramを実行しているユーザーである特定の_Job_Name_パターンに関連する_Job_Owner_データを取得するために、次のコードを作成しました。

_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>
_
18
Girardi

XPathで「//」構文を使用しているためです。その特定の構文は、その名前のドキュメント内の最初のノードを選択します。 XPath構文の詳細については、 https://www.w3schools.com/xml/xpath_syntax.asp をご覧ください。

子ノードを探している場合は、ノード名(IE: '// Job_Owner'ではなく 'Job_Owner')を使用してみてください。

22
Infernex87

Infernex87はJob_Ownerは、この場合にシンプルで効果的です。ただし、直接の子ではない場合は、次のことを実行できます。

.//Job_Owner

ディレクトリと同様に、.は現在のノードであるため、ドキュメントのルートではなく、現在のノードの子孫を検索します。

18

Infernex87はその理由を明らかにしました。 XMLを使用する場合、LINQルートを使用するのが適切なオプションになると思います。開始したい場合、 Scott Guのブログ は素晴らしいリソースです。

1
Arun

maXboxスクリプトを使用して、大きなDOM/xML/SQLルーチンを作成しました。

 function GetXMLFromURLAdr_IsSame_All(apath:string):boolean; 
 var 
 xml、ノード: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)次に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;
0
Max Kleiner