我在处理某些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>
答案 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;