दिलचस्प पोस्ट
सूचीशोधक संपूर्ण सूची पर लागू होता है आईफोन / आईपैड / ओएसएक्स: मेरा आईपी एड्रेस प्रोग्राम कैसे प्राप्त किया जाए? Jython के साथ मेरी पायथन स्क्रिप्ट JAR फ़ाइलों को वितरित करना? XML पर JSON को पसंद करते समय? Android: View.setID (int id) प्रोग्राममैटिक रूप से – ID संघर्षों से कैसे बचें? बहुत बड़ी टेक्स्ट फ़ाइल की अंतिम 10 लाइनें प्राप्त करें> 10 जीबी python3 –version दिखाता है "नाम: त्रुटि: नाम 'अजगर 3' परिभाषित नहीं है" एंड्रॉइड कैमरा के NV21 प्रारूप से काले और सफेद छवि निकालें libgdx स्प्राइटबैच बनावट को प्रस्तुत करना सी ++ को मॉलोक () के लिए एक कलाकार की आवश्यकता क्यों है, लेकिन सी नहीं है? फिर से प्रयास करें-पकड़ कैसे करें? क्या MSMQ क्यू में कितने संदेश हैं यह जांचने का कोई तरीका है? विजुअल स्टूडियो परियोजनाओं के निर्भरता ग्राफ़ अजगर में स्थानीय लोगों को संशोधित करना क्या हस्ताक्षरित इंटिजर्स पर बिटवर्ड ऑपरेशन के परिणाम परिभाषित किए गए हैं?

जावा में रीगेक्स के साथ XML को पार्स करना

नीचे दिए गए XML स्निपेट को देखते हुए मुझे डेटाएलेमेंट के तहत प्रत्येक बच्चे के लिए नाम / मूल्य जोड़े की सूची प्राप्त करने की आवश्यकता है I XPath या XML पार्सर का उपयोग मेरे नियंत्रण से बाहर के कारणों के लिए नहीं किया जा सकता है इसलिए मैं regex का उपयोग कर रहा हूं।

<?xml version="1.0"?> <StandardDataObject xmlns="myns"> <DataElements> <EmpStatus>2.0</EmpStatus> <Expenditure>95465.00</Expenditure> <StaffType>11.A</StaffType> <Industry>13</Industry> </DataElements> <InteractionElements> <TargetCenter>92f4-MPA</TargetCenter> <Trace>7.19879</Trace> </InteractionElements> </StandardDataObject> 

मुझे आउटपुट की आवश्यकता है: [{एम्प्स्टेटस: 2.0}, {व्यय: 95465.00}, {स्टाफटाइप: 11. ए}, {उद्योग: 13}]

डेटाएलेमेंट्स के तहत टैग नाम डायनेमिक हैं और इसलिए रीजेक्स में वाकई व्यक्त नहीं किया जा सकता है। टैग नाम TargetCenter और Trace स्थिर हैं और regex में हो सकता है लेकिन अगर वहाँ हार्डकोडिंग से बचने का एक तरीका है जो बेहतर होगा।

 "<([A-Za-z0-9]+?)>([A-Za-z0-9.]*?)</" 

यह मैंने बनाया regex है और इसकी समस्या है कि यह गलती से परिणामों में {ट्रेस: ​​719879} शामिल है। एक्सएमएल या किसी अन्य स्पष्ट स्वरूपण के भीतर नई लाइनों पर भरोसा करना एक विकल्प नहीं है।

नीचे मैं उपयोग कर रहा हूँ जावा कोड का एक सन्निकटन है:

 private static final Pattern PATTERN_1 = Pattern.compile(..REGEX..); private List<DataElement> listDataElements(CharSequence cs) { List<DataElement> list = new ArrayList<DataElement>(); Matcher matcher = PATTERN_1.matcher(cs); while (matcher.find()) { list.add(new DataElement(matcher.group(1), matcher.group(2))); } return list; } 

मैं केवल डेटा तत्वों को शामिल करने और बाकी को अनदेखा करने के लिए अपने regex को कैसे बदल सकता / सकती हूं?

Solutions Collecting From Web of "जावा में रीगेक्स के साथ XML को पार्स करना"

यह जावा में काम करना चाहिए, यदि आप मान सकते हैं कि डेटाएलेमेंट्स टैग के बीच, सब कुछ में फॉर्म वैल्यू है। Ie कोई विशेषताओं, और नेस्टेड तत्वों नहीं

 Pattern regex = Pattern.compile("<DataElements>(.*?)</DataElements>", Pattern.DOTALL); Matcher matcher = regex.matcher(subjectString); Pattern regex2 = Pattern.compile("<([^<>]+)>([^<>]+)</\\1>"); if (matcher.find()) { String DataElements = matcher.group(1); Matcher matcher2 = regex2.matcher(DataElements); while (matcher2.find()) { list.add(new DataElement(matcher2.group(1), matcher2.group(2))); } } 

XML एक नियमित भाषा नहीं है आप इसे नियमित अभिव्यक्ति का उपयोग करके पार्स नहीं कर सकते । एक अभिव्यक्ति जो आपको लगेगी कि जब आप नेस्टेड टैग प्राप्त करते हैं तो टूट जाएगा, तब जब आप यह तय करेंगे कि यह XML टिप्पणियों पर तोड़ देगा, फिर सीडीएटीए अनुभाग, फिर प्रोसेसर निर्देश, तब नामस्थान, … यह काम नहीं कर सकता, एक XML पार्सर का उपयोग करें

इसके बजाय XPath का उपयोग करें!

आप वास्तव में इस के लिए एक XML पुस्तकालय का उपयोग करना चाहिए

यदि आपको आरई का उपयोग करना है, तो इसे दो चरणों में क्यों नहीं करें? DataElements>.*?</DataElements तो आपके पास अब क्या है

क्या कोई कारण है कि आप regex के बजाय एक उचित XML पार्सर का उपयोग नहीं कर रहे हैं? यह सही पुस्तकालय के साथ तुच्छ होगा।

आपको अभी तक एक और "रिगेक्स का उपयोग न करें" उत्तर देने के लिए क्षमा करें, लेकिन गंभीरता से कृपया कॉमन्स-डाइजेस्टर , जेएएसीपी (जावा 5+ के साथ बंडल) या जेएसीएबी (जावा 6+ के साथ बंडल) का उपयोग करें क्योंकि यह आपको चोट के नाव से बचाएगा।

आपको सभी को सुनना चाहिए हल्के पार्सर एक बुरा विचार है

हालांकि, यदि आप वास्तव में इसके बारे में कठिन हैं, तो आप डेटाएलेमेंट्स टैग के बाहर टैग को बाहर करने के लिए अपना कोड ज़ूम करने में सक्षम होना चाहिए।

 private static final Pattern PATTERN_1 = Pattern.compile(..REGEX..); private static final String START_TAG = "<DataElements>"; private static final String END_TAG = "</DataElements>"; private List<DataElement> listDataElements(String input) { String cs = input.substring(input.indexOf(START_TAG) + START_TAG.length(), input.indexOf(END_TAG); List<DataElement> list = new ArrayList<DataElement>(); Matcher matcher = PATTERN_1.matcher(cs); while (matcher.find()) { list.add(new DataElement(matcher.group(1), matcher.group(2))); } return list; } 

यदि डेटालेमेंट टैग मौजूद नहीं है तो यह बहुत ही असफल हो जायेगा।

एक बार फिर, यह एक बुरा विचार है, और आप संभवतया इस बग रिपोर्ट के रूप में भविष्य में कुछ समय के इस कोड की समीक्षा करेंगे।

प्रॉपर्टी फाइल के जरिए रेग एक्स पार्स करने की कोशिश करें और फिर पैटर्न ऑब्जेक्ट बनाएं। मैंने एक ही मुद्दे को सुलझाने का प्रयास किया, जब मैं रेग एक्स को एक्सएमएल बीन्स के जरिये इंजेक्शन कर रहा था।

पूर्व: – मुझे रेग एक्स '(डी [0- 9] {7} के पार्स करने की आवश्यकता थी। [0- 9] {9}। [एजीड] {3} [0- 9] {4} ) (।) 'वसंत में इंजेक्शन द्वारा लेकिन यह काम नहीं कर रहा था एक बार जब जावा कक्षा में एक ही रेग पूर्व कड़ी मेहनत का उपयोग करने की कोशिश की तो उसने काम किया।

पैटर्न पैटर्न = Pattern.compile ("(।) (डी [0- 9] {7}। [0- 9] {9}। [एज़] {2} [0- 9] {4}) (। ) "); Matcher matcher = pattern.matcher (file.getName ()। ट्रिम ());

 Next I tried to load that Reg Ex via property file while injecting it. It worked fine. p:remoteDirectory="${rawDailyReport.remote.download.dir}" p:localDirectory="${rawDailyReport.local.valid.dir}" p:redEx="${rawDailyReport.download.regex}" 

और संपत्ति फ़ाइल में संपत्ति निम्नानुसार परिभाषित की गई है।

rawDailyReport.download.regex = (। ) (डी [0- 9] {7} \। डी [0- 9] {9} \। डी [एज़] {2} [0-9] {4}) (। )

इसका कारण यह है कि प्लेसहोल्डर वाले मान ऑर्ग। स्पिंगफ्रेमवर्क। बीन्स.फिएटर। कॉन्फ़िगर। प्रॉपरटी प्लेसहोल्डर कॉन्फ़िग्युरर के माध्यम से लोड किए जाते हैं और इन एक्सएमएल संवेदनशील अक्षरों को आंतरिक रूप से संभालता है।

धन्यवाद, अमिथ