2013-12-15 4 views
7

एक यूनिट टेस्ट प्रोजेक्ट में, मुझे कुछ मदद की ज़रूरत है कि मैं कैसे मार्शल एक्सएमएल में 2 अनावश्यक माता-पिता नोड्स को छुपा सकता हूं? क्या कोई मुझे यह समझने में मदद कर सकता है कि इसे कैसे किया जाए?एक्सस्ट्रीम: मैं मार्शल एक्सएमएल में 2 अनावश्यक माता-पिता नोड्स कैसे छिपा सकता हूं?

मेरे marshalled output इस तरह दिखता है:

<suite> 
    <suiteName>Suite 1</suiteName> 
    <sauceURL>http://username-string:[email protected]:80/wd/hub</sauceURL> 
    <tests> 
    <test> 
     <rowArgs> 
     <arg> 
      <enabled type="java.lang.Boolean">true</enabled> 
     </arg> 
     <arg> 
      <testname type="java.lang.String">Test 1</testname> 
     </arg> 
     <arg> 
      <environment type="java.lang.String">portal1</environment> 
     </arg> 
     <arg> 
      <testlocale type="java.lang.String">Grid</testlocale> 
     </arg> 
     <arg> 
      <browser type="java.lang.String">Firefox</browser> 
     </arg> 
     <arg> 
      <url type="java.lang.String">http://google.com</url> 
     </arg> 
     </rowArgs> 
    </test> 
      ... 

लेकिन मैं अनावश्यक "rowArgs" और "आर्ग" टैग को छिपाने के लिए इतना है कि शेष नोड्स परीक्षण नोड के अंतर्गत तुरंत कर रहे हैं चाहते हैं। मैं यह कैसे कर सकता हूँ?

आप मेरी मदद करने के लिए see my code HERE, if it helps कर सकते हैं। मुझे संदेह है कि मुझे अपना ट्रांसफार्मर लिखने की ज़रूरत है? मैं इस दौरान उस प्रयोग पर काम करूंगा।

उत्तर

4

वास्तव में आपको इसके लिए एक कस्टम कनवर्टर की आवश्यकता होगी क्योंकि यह दो नेस्टेड संग्रह है जिसे आप दिखाना नहीं चाहते हैं और उन वस्तुओं में अन्य बच्चे तत्व हो सकते हैं जिन्हें क्रमबद्ध किया जाएगा।

यह एक मामला सीधे XStream द्वारा कवर नहीं किया गया है, लेकिन एक कस्टम कनवर्टर के साथ आसानी से तय किया गया है।

आप इसे git clone of your project में देख सकते हैं जिसमें सभी संशोधन शामिल हैं। लेकिन जैसा कि सबकुछ यहां दिखाई देना चाहिए, मैं बाद में कुछ कोड उदाहरणों सहित प्रश्न के मुख्य भाग समझाता हूं।

मैंने आपके प्रोजेक्ट के लिए इस तरह के एक कनवर्टर को लागू किया।

@Override 
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { 
    TestRow test = (TestRow)source; 
    for (TestArguments arg : test.getArguments()) { 
     for (ArgObject val : arg.getAllTestArguments()) { 
     writer.startNode(val.getKey()); 
     writer.addAttribute("type", val.getType()); 
     writer.setValue(val.getVal()); 
     writer.endNode(); 

     } 
    } 
    } 

    @Override 
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { 
    TestArguments testargs = new TestArguments(); 
    while (reader.hasMoreChildren()) { 
     reader.moveDown(); 
     String typeval = reader.getAttribute("type"); 
     if (typeval.isEmpty()) { 
     typeval = "null"; 
     } 
     testargs.getAllTestArguments().add(new ArgObject(reader.getNodeName(), typeval, reader.getValue())); 
     reader.moveUp(); 
    } 
    TestRow result = new TestRow(testargs); 
    return result; 
    } 

यह फ्लैट नोड संरचना आप अपने ArgConverter में परिभाषित के साथ एक्सएमएल के लिए सभी ArgObjects को क्रमानुसार होगा: कोड रूपांतरण कर रही है। Deserialization वस्तु को इस डेटा से वापस बनाता है।

  • Xstream अक्रमांकन सभी उर्फ ​​एनोटेशन को नहीं पहचानता है:

    आप अपने स्रोत कोड में दो कीड़े जो अक्रमांकन सका। इसमें आपके मूल तत्व SuiteData (सूट के लिए उपनाम) के साथ समस्याएं थीं। इसके लिए मैंने आपके XMLDataHelper में इस xStream.alias("suite", SuiteData.class); जैसे एक्सस्ट्रीम ऑब्जेक्ट में एक एलियाड जोड़ा।

  • यदि आप एक डिफ़ॉल्ट कन्स्ट्रक्टर के साथ TestArguments उदाहरण बनाते हैं (जैसा कि आपको deserialization के माध्यम से करना होगा), तो आप रीसेट को कॉल करते हैं जो आपके argsWrapper सदस्य को शून्य पर असाइन करता है जो तर्क को काफी असंभव बनाता है। मैंने तय किया कि रीसेट विधि (argsWrapper = new ArrayList<ArgObject>();) में सदस्य चर प्रारंभ करने वाला नया होना चाहिए।

जहां तक ​​मैं आपका कोड समझता हूं, यह क्रमिकरण/deserialization के लिए अपेक्षित काम करता है। मैंने इस प्रक्रिया को हर तरह से मजबूर करने के लिए एक छोटा परीक्षण कार्यक्रम लिखा और ऐसा लगता है कि यह परिणाम उत्पन्न होता है:

public class XMLDataHelperTest { 

    public static void main(String[] args) { 
    File file = new File(System.getProperty("user.dir"), "test.xml"); 
    if (file.isFile()) { 
     assertTrue(file.delete()); 
    } 

    // write it once 
    XMLDataHelper helper = new XMLDataHelper(file.getAbsolutePath()); 

    // read it once 
    helper = new XMLDataHelper(file.getAbsolutePath()); 
    System.out.println(file); 
    } 
} 
+0

हां, ऐसा लगता है कि यह काम करता है। मैंने अपना रेपो अपडेट किया। मुझे टेस्टअर्गेमेंट्स क्लास के सेट विधियों में, मेरे अनमोललिंग में एक छोटी सी बग को ठीक करने की ज़रूरत है। धन्यवाद। – djangofan

+0

बढ़िया है कि यह आपके लिए भी काम करता है। – Matthias

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

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