كيف يمكنني الرجوع 'التالي' (حتى الآن غير موجود) عقدة XML في سلسلة?

StackOverflow https://stackoverflow.com/questions/689291

  •  22-08-2019
  •  | 
  •  

سؤال

وذلك لتوسيع...

لدي بعض XML

<root>
    <list>
        <item value="9"/>
        <item value="3"/>
        <item value="1"/>
        <item value="8"/>
        <item value="4"/>
    </list>
</root>

لدي XPath "/الجذر/قائمة/البند [4]" التي أعتقد أنها سوف استرداد 5 "البند" عنصر (قيمتها السمة 4)

هذا يشير إلى أن XPath "/الجذر/قائمة/البند [5]" مرجع (حتى الآن غير موجودة) 6 البند.

ما أود هو تعبير XPath التي تشير 'التالي' (حتى الآن غير متوفرة) "البند" عنصر بغض النظر عن كيفية العديد من العناصر التي توجد حاليا...

أعتقد أن هذا سوف تمر تعبير (التي سيتم الاعتماد على عدد من العناصر الحالية) بدلا من الثابت ترميز عدد.

أنا أعرف كيف نفعل ذلك, ولكن ببساطة لا يمكن العثور على كيف يجب أن أفعل ذلك...محبطة.

التحديث:لتوضيح...أود أن عودة "البند عقدة بعد آخر عنصر العقدة".سمات كانت هناك فقط لتمييز العقد الموجودة).أقدر أن هذه العودة فارغة nodeset.

التحديث:حسنا لدي إجابة لذا أعتقد أنه من الإنصاف أن أشرح لماذا أردت هذا :)

أساسا xPath يستخدم من قبل بعض .صافي رمز مثل كتابة العنوان بدلا من قراءة العنوان.

مررت xPath غير موجودة الموقع إلى EnsureNodeExists الروتينية.(ملاحظة:لا يمكنني تغيير هذه EnsureNodeExists الروتين) سوف رمز تكرار كل عنصر من xPath ، وخلق ذلك إذا لم يكن هناك ومن ثم وضع مثل الوالدين عن التكرار التالي.

وبالتالي لا يمكن أن نسمي هذا الرمز مع "/الجذر/قائمة/البند[موقف() = الماضية()]/التالية-الأخوة::البند[1]" 3 مرات و هذا سيؤدي إلى 3 بند العقد الذي يتم إنشاؤه.

هل كانت مفيدة؟

المحلول

من أول وهلة ، XPath:

/root/list/item[4]

جلب البند الرابع (منذ [4] المسند هو اختصار ل [position() = 4]).

لجلب هذا البند مع @value 4, استخدام:

/root/list/item[@value = '4']

إذا كنت ترغب في جلب هذا البند بعد البند مع @value 4, استخدام:

/root/list/item[@value = '4']/following-sibling::item[1]

وهذا يترجم إلى الإنجليزية "من /root/list/item مع @value = '4', أنظر التالية الأشقاء اسمه "البند" و تأخذ أول واحد".

هذا يعمل حتى إذا لم يكن هناك البند التالي.في هذه الحالة المحددة تعيين عقدة ستكون فارغة.

تحرير:تكون على علم أن النتائج المذكورة أعلاه التعبير تنتج قد تكون غير متوقعة إذا كان هناك أكثر من عنصر واحد مع قيمة 4.سوف تحصل على كل البنود التي تتبع عنصر مع قيمة أربعة.هذا سيعود عنصر واحد في الأقصى:

/root/list/item[@value = '4'][1]/following-sibling::item[1]

للإشارة إلى العقدة الأخيرة في قائمة الاستخدام:

/root/list/item[position() = last()]

لطيفة البصرية التي يفسر XPath محاور يمكن العثور عليها هنا: http://nwalsh.com/docs/tutorials/xsl/xsl/graphics/axes.gif (جزء من أكبر التعليمي).

نصائح أخرى

إذا كنت ترغب فقط في تعبير العودة فارغة nodeset العامة أن تفعل الشيء أعتقد هو شيء من هذا القبيل /parent::node(), والتي سوف تكون فارغة لأن الجذر لا الآباء.

أنا افترض أنك يمكن أن تفعل شيئا مثل /root/list/item[position() = (last() + 1)], ولكن سوف تعطيك نفس النتيجة مثل أي شيء عاد لا العقد.لذلك أنا لست متأكدا تماما ما كنت في الواقع محاولة لإنجاز.

جرب ما يلي-الأخوة التعبير

مساعدة مع هذا النوع من الشيء يمكن العثور عليها هنا

إذا ما كنت تحاول القيام به هو إضافة عقدة جديدة مباشرة بعد آخر واحد في مجموعة ، ثم في MSXML يمكنك فقط استخدام appendChild على العنصر الأصل (قائمة).أنه سيتم إلحاق آخر طفل من عقدة الأم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top