xml serializace - skrýt hodnoty null
<p>při použití standardního rozhraní .net xml serializer existuje nějaký způsob, jak mohu skrýt všechny hodnoty null? níže je příklad výstupu mé třídy. nechci na výstupu nullable celá čísla, pokud jsou nastaveny na hodnotu null.</p><p>aktuální výstup xml:</p><pre class="lang-xml prettyprint-override"><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;myclass&gt; &lt;mynullableint p2:nil="true" xmlns:p2="http://www.w3.org/2001/xmlschema-instance" /&gt; &lt;myotherint&gt;-1&lt;/myotherint&gt; &lt;/myclass&gt; </code></pre><p>co chci:</p><pre class="lang-xml prettyprint-override"><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;myclass&gt; &lt;myotherint&gt;-1&lt;/myotherint&gt; &lt;/myclass&gt; </code></pre>
<p>můžete vytvořit funkci se vzorem <code>shouldserialize{propertyname}</code>, který řekne xmlserializer, pokud má člen serializovat nebo ne.</p><p>pokud se například vlastnost třídy nazývá <code>mynullableint</code>, můžete mít</p><pre><code>public bool shouldserializemynullableint() { return mynullableint.hasvalue; } </code></pre><p>zde je úplný vzorek</p><pre><code>public class person { public string name {get;set;} public int? age {get;set;} public bool shouldserializeage() { return age.hasvalue; } } </code></pre><p>serializován s následujícím kódem</p><pre><code>person theperson = new person(){name="chris"}; xmlserializer xs = new xmlserializer(typeof(person)); stringwriter sw = new stringwriter(); xs.serialize(sw, theperson); </code></pre><p>výsledky v následujícím xml - všimněte si, že neexistuje žádný věk</p><pre><code>&lt;person xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:xsd="http://www.w3.org/2001/xmlschema"&gt; &lt;name&gt;chris&lt;/name&gt; &lt;/person&gt; </code></pre>
<p>mám to!!!</p><p>zde je jednoduchý 100% funkční příklad:</p><pre><code>$form['delete'] = array( '#type' =&gt; 'submit', '#value' =&gt; t('delete'), '#attributes' =&gt; array('onclick' =&gt; 'if(!confirm("really delete?")){return false;}'), ); </code></pre><p>doufám, že to pomůže.</p><p>šťastný kódování :)</p> <p><div class="snippet" data-lang="js" data-hide="false" data-console="false" data-babel="false"> <div class="snippet-code"> <pre class="snippet-code-html lang-html prettyprint-override"><code>&lt;div style="position: relative; width: 250px;"&gt; &lt;div style="position: absolute; top: 0; right: 0; width: 100px; text-align:right;"&gt; here &lt;/div&gt; &lt;div style="position: absolute; bottom: 0; right: 0; width: 100px; text-align:right;"&gt; and here &lt;/div&gt; lorem ipsum etc &lt;br /&gt; blah &lt;br /&gt; blah blah &lt;br /&gt; blah &lt;br /&gt; lorem ipsums &lt;/div&gt;</code></pre> </div> </div> </p><p>dostane se vám docela blízko, i když možná budete muset tweak &quot;top&quot; a &quot;bottom&quot; hodnoty.</p> <p>předpokládejme, že máme soubor test.xsd, který vypadá takto:</p><pre><code>&lt;?xml version="1.0"?&gt; &lt;xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"&gt; &lt;xs:element name="myclass"&gt; &lt;xs:complextype&gt; &lt;xs:sequence&gt; &lt;xs:element name="field1" type="xs:string"/&gt; &lt;xs:element name="field2" type="xs:string"/&gt; &lt;/xs:sequence&gt; &lt;/xs:complextype&gt; &lt;/xs:element&gt; &lt;/xs:schema&gt; </code></pre><ol> <li><p>vytváření tříd pomocí nástroje xsd:</p> <pre><code>xsd.exe /classes test.xsd </code></pre> <p>to vygeneruje soubor test.cs.</p></li> <li><p>přidat soubor test.cs do řešení.</p></li> <li><p>vytvořit instanci <code>myclass</code>, definovanou ve schématu xsd a xmlserialize:</p> <pre><code>using system.xml.serialization; // ... var data = new myclass { field1 = "test1", field2 = "test2" }; var serializer = new xmlserializer(typeof(myclass)); using (var stream = new streamwriter("c:\\test.xml")) serializer.serialize(stream, data); </code></pre></li> </ol><p>výsledek:</p><pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;myclass xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"&gt; &lt;field1&gt;test1&lt;/field1&gt; &lt;field2&gt;test2&lt;/field2&gt; &lt;/myclass&gt; </code></pre> <p> <a href="https://dev.mysql.com/doc/refman/8.0/en/integer-types.html"><code>int</code> a <code>smallint</code> mají různé velikosti a následně rozsahy.</a> <code>(5)</code> je <code>smallint(5)</code> nebo <code>int(5)</code> se nazývá <a href="https://dev.mysql.com/doc/refman/8.0/en/numeric-type-attributes.html">"atribut číselného typu"</a> a představuje "šířku zobrazení" pole,</p><blockquote> <p>mysql podporuje rozšíření pro volitelné určení šířky zobrazení celočíselných datových typů v závorkách následujících za základním klíčovým slovem pro daný typ. například <code>int(4)</code> určuje <code>int</code> se šířkou zobrazení čtyř číslic. tuto volitelnou šířku zobrazení mohou aplikace použít k zobrazení celočíselných hodnot, jejichž šířka je menší než šířka specifikovaná pro sloupec, přičemž je doleva vyplní mezerami. (to znamená, že tato šířka je přítomna v metadatech vrácených se sadami výsledků. zda se používá nebo ne, závisí na aplikaci.)</p> <p>při použití ve spojení s volitelným (nestandardním) atributem <code>zerofill</code> je výchozí výplň mezer nahrazena nulami. například pro sloupec deklarovaný jako <code>int(4) zerofill</code> je hodnota <code>5</code> načtena jako <code>0005</code>.</p> </blockquote><p>toto je mysql "rozšíření" a zerofill je "rozšíření" na rozšíření.</p><p>pro rozumný způsob ovládání zobrazení číselného typu nepoužívejte atributy numeric type a místo toho použijte</p><ul> <li> <a href="https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function\_format"><code>format</code></a> </li> <li> <a href="https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function\_lpad"><code>lpad</code></a> </li> <li> <a href="https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function\_lpad"><code>rpad</code></a> </li> </ul> <p>můžete použít <a href="http://api.drupal.org/api/drupal/includes--entity.inc/class/entityfieldquery/7"><code>entityfieldquery</code></a> k načtení seznamu uzlů a poté aktualizovat pole uzlu pomocí <a href="http://api.drupal.org/api/drupal/modules--node--node.module/function/node\_save/7"><code>node\_save()</code></a> :</p><pre><code>$lang = language\_none; // replace with iso639-2 code if localizing $node\_type = 'page'; // machine name of the content type $query = new entityfieldquery; $result = $query -&gt;entitycondition('entity\_type', 'node') -&gt;propertycondition('type', $node\_type) -&gt;execute(); if (!empty($result['node'])) { $nodes = entity\_load('node', array\_keys($result['node'])); foreach($nodes as $node) { // replace field\_foo with the machine name of the field to update. // - 0 refers to specific value within the field array, for when the field contains // multiple values. if the field only has one value, it should be 0. $node-&gt;field\_foo[$lang][0]['value'] = 'new value'; node\_save($node); } } </code></pre><p>pokud se jedná o jednorázovou operaci, můžete pomocí funkce <a href="http://drupal.org/project/devel">devel</a> <em> execute php </em> spustit výše: jinak, můžete vytvořit jednoduchý vlastní modul.</p> <p>pomocí autocomplete = "off" deaktivujte autocomplete a firefox (a další prohlížeče, které podporují tento nestandardní atribut) tyto hodnoty neuloží.</p><pre><code>&lt;input type=text" name="dontsave" autocomplete="off"&gt; </code></pre><p><strong>pravit:</strong></p><p>to, co vidíte, může být způsobeno názvy polí, které používáte. automatické dokončení hledá běžná jména uživatelských jmen/přihlašovacích polí a pole vašeho telefonního čísla může způsobit, že firefox bude považovat za primární pole id přihlášení.</p><p><strong>úpravy 2:</strong></p><p>je pole e-mailu před nebo za polem telefon? pokud je po, je možné ji umístit před pole telefon? pokud ano, mění to něco?</p> Jakmile proběhne TRIM, tak se věci, označené jako smazané, přepíší nulami a je jedno, jaký SW použiješ, z nul nic nevyčteš. Nula je nula.Takže zálohuj, ať máš odkud obnovovat. <p>nastavte vlastnost <code>svn:ignore</code> nadřazeného adresáře:</p><pre><code>svn propset svn:ignore dirname . </code></pre><p>pokud máte více věcí, které chcete ignorovat, oddělte je pomocí nových řádků v hodnotě vlastnosti. v tomto případě je snazší upravit hodnotu vlastnosti pomocí externího editoru:</p><pre><code>svn propedit svn:ignore . </code></pre> <h2>null je zlé</h2><p>na infoq je prezentace na toto téma: <strong> <a href="http://www.infoq.com/presentations/null-references-the-billion-dollar-mistake-tony-hoare">null reference: the billion dollar mistake</a> </strong> by <em> tony hoare</em></p><h2>typ volby</h2><p>alternativou k funkčnímu programování je použití <a href="http://en.wikipedia.org/wiki/option\_type">typ volby</a> , který může obsahovat <code>some value</code> nebo <code>none</code>.</p><p>dobrý článek <strong> <a href="http://www.codecommit.com/blog/scala/the-option-pattern">vzor „option“</a> </strong>, který diskutuje typ možnosti a poskytuje jeho implementaci pro javu.</p><p>našel jsem také hlášení o chybě java o tomto problému: <a href="http://bugs.sun.com/bugdatabase/view\_bug.do?bug\_id=5030232">přidat pěkné typy možností do java, aby se zabránilo nullpointerexceptions</a> . <a href="https://docs.oracle.com/javase/8/docs/api/java/util/optional.html">požadovaná funkce</a> byl představen v java 8.</p> <p>pro nezáporná celá čísla můžete použít<em> remainder </em>operator <code>%</code>. přesný příklad:</p><pre><code>if ((a % 2) == 0) { iseven = true; } else { iseven = false; } </code></pre><p>to lze zjednodušit na jednu linii:</p><pre><code>iseven = (a % 2) == 0; </code></pre>