2012-06-15 8 views
6

वैकल्पिक नोड के अस्तित्व के लिए परीक्षण करने का सही तरीका क्या है? मेरी एक्सएमएल का एक snipped है:मैं कैसे परीक्षण करूं कि कोई निश्चित XML नोड मौजूद है या नहीं?

<Antenna > 
    <Mount Model="text" Manufacture="text"> 
    <BirdBathMount/> 
    </Mount> 
</Antenna> 

लेकिन यह भी हो सकता है:

<Antenna > 
    <Mount Model="text" Manufacture="text"> 
    <AzEl/> 
    </Mount> 
</Antenna> 

एंटीना के बच्चे या तो birdbath या आसेल हो सकता है, लेकिन दोनों नहीं ...

डेल्फी XE में मैंने कोशिश की है:

if (MountNode.ChildNodes.Nodes['AzEl'] <> unassigned then //Does not work 
if (MountNode.ChildNodes['BirdBathMount'].NodeValue <> null) then // Does not work 
if (MountNode.BirdBathMount.NodeValue <> null) then // Does not work 

मैं XMLSpy का उपयोग स्कीमा और उदाहरण एक्सएमएल बनाने के लिए और वे सही ढंग से पार्स। मैं बाइंडिंग बनाने के लिए डेल्फी एक्सई का उपयोग करता हूं और यह अधिकांश अन्य संयोजनों पर ठीक काम करता है।

यह एक साधारण उत्तर है जिसे मैंने अभी अनदेखा किया है - लेकिन क्या? धन्यवाद ...... जिम

+1

क्या आपने इकाई "वेरिएंट" से "VarIsNull()" को आजमाया है? XPath के लिए – paulsm4

उत्तर

8

आप XPath का उपयोग कर सकते हैं, इस नमूना को आजमाएं।

uses 
    MSXML; 


Var 
    XMLDOMDocument : IXMLDOMDocument; 
    XMLDOMNode  : IXMLDOMNode; 
begin 
    XMLDOMDocument:=CoDOMDocument.Create; 
    XMLDOMDocument.loadXML(XmlStr); 
    XMLDOMNode := XMLDOMDocument.selectSingleNode('//Antenna/Mount/BirdBathMount'); 
    if XMLDOMNode<>nil then 
    Writeln('BirdBathMount node Exist') 
    else 
    begin 
    XMLDOMNode := XMLDOMDocument.selectSingleNode('//Antenna/Mount/AzEl'); 
    if XMLDOMNode<>nil then 
     Writeln('AzEl node Exist'); 
    end; 
end; 
+1

+1। चूंकि दस्तावेज पहले से ही किसी भी वास्तविक विश्व परीक्षण में मौजूद होगा, इसलिए उपरोक्त कोड नमूना वास्तव में 'selectSingleNode' कॉल' हो सकता है। –

+1

ध्यान दें कि यह माइक्रोसॉफ्ट-विशिष्ट है। यदि आप 'DOMVendor' को MSXML (विंडोज़ पर डिफ़ॉल्ट) पर सेट करते हैं तो आप' TXMLDocument/IXMLDocument' के साथ XPath का उपयोग कर सकते हैं। –

+0

आप सही हैं !!! प्रश्न में मैंने अनदेखा किया "एंटीना का बच्चा या तो पक्षीबाथ या एज़ेल हो सकता है लेकिन दोनों नहीं ..."। क्या यह आपके लिए ठीक है, अगर मैं अपनी टिप्पणियों को हटा देता हूं ?? –

1

मैंने इसे सफलतापूर्वक परीक्षण किया है। इस कोड के साथ। यह कुछ हद तक जटिल है और मुझे रूट तत्व की आवश्यकता है।

XmlFile

<ThisIsTheDocumentElement> 
<Antenna > 
    <Mount Model="text" Manufacture="text"> 
    <BirdBathMount/> 
    </Mount> 
</Antenna> 
<Antenna > 
    <Mount Model="text" Manufacture="text"> 
    <AzEl/> 
    </Mount> 
</Antenna> 
</ThisIsTheDocumentElement> 

Delphi2010.pas

procedure TForm1.RetrieveDocument; 
var 
    LDocument: IXMLDocument; 
    LNodeElement, LNode,BNode,CNode : IXMLNode; 
    I: Integer; 
begin 
    LDocument := TXMLDocument.Create(nil); 
    LDocument.LoadFromFile(XmlFile); 
    LNodeElement := LDocument.ChildNodes.FindNode('ThisIsTheDocumentElement'); 
    if (LNodeElement <> nil) then 
    begin 
    for I := 0 to LNodeElement.ChildNodes.Count - 1 do 
    begin 
     LNode := LNodeElement.ChildNodes.Get(I); 
     if (LNode <> Nil) AND (LNode.NodeName='Antenna') then begin 
      Memo1.lines.Add('Node name: ' + LNode.NodeName); 
      BNode:=LNode.ChildNodes.FindNode('Mount'); 
     if (BNode <> Nil) then CNode:=BNode.ChildNodes.FindNode('AzEl'); 
      if (CNode <> Nil) then Memo1.lines.Add('found: '+CNode.NodeName) else continue; 
     end; 
    end; 
    end; 
end; 

उत्पादन:

Node name: Antenna 
Node name: Antenna 
found: AzEl 
+0

मेरे लिए क्या काम किया गया था: 'code'if (mountNode.ChildNodes.FindNode (' AzEl ') <> nil) तो ' कोड ' –

+0

मेरे उदाहरण में। बीएनओडी == माउंटनोड –

+0

@ मस्जिटो-एक्स XPath वाक्यों // // एंटीना/माउंट/बर्डबाथमाउंट' और '// एंटीना/माउंट/एज़ईएल 'ओपी द्वारा पोस्ट की गई एक्सएमएल के साथ काम करता है, शायद आप एक और एक्सएमएल के साथ प्रयास कर रहे हैं। – RRUZ

8

उपयोग .FindNode। अगर नोड मौजूद नहीं है, तो यह शून्य लौटाता है।

उदा।

xmlNode := MountNode.ChildNodes.FindNode('AzEl'); 
if Assigned(xmlNode) then 
... 
+1

यह वह है जिसने आखिरकार मेरे लिए काम किया। {कोड} अगर (माउंटनोड.ChildNodes.FindNode ('AzEl') <> शून्य) तो {कोड} –

+0

मेरे उदाहरण में। बीएनओडी == माउंटनोड –

0

क्या मेरे लिए काम किया था: मेरे लिए स्पष्ट नहीं

if (MountNode.ChildNodes.FindNode('AzEl') <> nil) then 

इसका कैसे nil विकल्पों का जवाब doAttrNull तरह TXMLDocumnet पर स्थापित करने, लेकिन यह काम करता है।

संबंधित मुद्दे

 संबंधित मुद्दे