2011-12-15 24 views
6

जब इस कोड चल मैं यह त्रुटि हो रही है: Fatal error: Uncaught exception 'DOMException' with message 'Invalid Character Error' in test.php:29 Stack trace: #0 test.php(29): DOMDocument->createElement('1OhmStable', 'a') #1 {main} thrown in test.php on line 29 पीएचपी अमान्य वर्ण त्रुटि

नोड्स मूल XML फ़ाइल से अमान्य वर्ण करते हैं, लेकिन जैसा कि मैंने नोड्स से दूर अमान्य वर्ण अलग करना कर रहा हूँ, नोड्स बनाया जाना चाहिए। मूल XML दस्तावेज़ पर मुझे किस प्रकार का एन्कोडिंग करने की आवश्यकता है? क्या मुझे saveXML को डीकोड करने की ज़रूरत है?

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet href="/v1/xsl/xml_pretty_printer.xsl" type="text/xsl"?> 
<products> 
<product> 
<modelNumber>M100</modelNumber> 
<itemId>1553725</itemId> 
<details> 
    <detail> 
    <name>1 Ohm Stable</name> 
    <value>600 x 1</value> 
    </detail> 
</details> 
</product> 
</products> 

नया दस्तावेज़ इस तरह दिखना चाहिए:

function __cleanData($c) 
{ 
    return preg_replace("/[^A-Za-z0-9]/", "",$c); 
} 
$xml = new DOMDocument('1.0', 'UTF-8'); 
$xml->load('test.xml');  
$xml->formatOutput = true; 

$append = array(); 
foreach ($xml->getElementsByTagName('product') as $product) 
    { 
     foreach($product->getElementsByTagName('name') as $name) 
     { 

      $append[] = $name; 
     } 
       foreach ($append as $a) 
       { 
        $nodeName = __cleanData($a->textContent); 

         $element = $xml->createElement(htmlentities($nodeName) , 'a'); 
       } 
     $product->removeChild($xml->getElementsByTagName('details')->item(0)); 
     $product->appendChild($element); 
    } 

$result = $xml->saveXML(); 
$file = "data.xml"; 
file_put_contents($file,$result); 

इस तरह क्या मूल एक्सएमएल लग रहा है अगर यह UTF है:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet href="/v1/xsl/xml_pretty_printer.xsl" type="text/xsl"?> 
<products> 
<product> 
<modelNumber>M100</modelNumber> 
<itemId>1553725</itemId> 
    <1 Ohm Stable> 

    </1 Ohm Stable> 

    </product> 
</products> 
+0

आप स्वयं से बात करना पसंद करते हैं, एक्सएमएल कहां है? – ajreal

+0

@ajreal बस इसे ऊपर रखें –

+1

आप स्वच्छ संस्करण क्यों पोस्ट करते हैं? – ajreal

उत्तर

10

, बस आप एक तत्व नाम का उपयोग नहीं कर सकते हैं संख्या के साथ शुरू

1OhmStable <-- rename this 
_1OhmStable <-- this is fine 

php parse xml - error: StartTag: invalid element name

एक अच्छा लेख: - http://www.xml.com/pub/a/2001/07/25/namingparts.html

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

0

यकीन है कि स्क्रिप्ट समान कूट किया हुआ है सुनिश्चित करें कि वे फ़ाइल के बहुत शुरुआत में बाइट ऑर्डर मार्क (बीओएम) के बिना हैं। ऐसा करने के लिए अपनी XML फ़ाइल को टेक्स्ट एडिटर जैसे नोटपैड ++ के साथ खोलें और अपनी फ़ाइल को "यूटीएफ -8 बिना बीओएम" में परिवर्तित करें।

मैं एक ऐसी ही त्रुटि थी, लेकिन एक json file

5

साथ आप नहीं लिखा है, जहां आप उस त्रुटि मिलती है।

preg_replace("/[^A-Za-z0-9]/", "",$c); 

यह प्रतिस्थापन UTF-8 एन्कोडेड तार (जो DOMDocument द्वारा किया जाता है) के लिए नहीं लिखा है: यदि आप मूल्य साफ करने के बाद मामले में यह है, यह मेरा अनुमान है। आप कर सकते हैं यह UTF-8 u-modifier (PCRE8)­Docs का उपयोग करके संगत:

preg_replace("/[^A-Za-z0-9]/u", "",$c); 
          ^

यह सिर्फ एक अनुमान है, मैं आप अपने प्रश्न जो आपके कोड का हिस्सा त्रुटि से चलाता में यह अधिक सटीक बनाने के सुझाव देते हैं।

1

भले ही __cleandata() लैटिन वर्णमाला ए-जेड और संख्याओं की तुलना में अन्य सभी वर्णों को हटा देगा, यह आवश्यक रूप से गारंटी नहीं देता है कि परिणाम एक वैध XML नाम है। आपका फ़ंक्शन स्ट्रिंग्स को वापस कर सकता है जो संख्या से शुरू होता है लेकिन संख्याएं गैरकानूनी नाम एक्सएमएल में अक्षर शुरू करती हैं, वे केवल पहले नाम के चरित्र के नाम पर ही दिखाई दे सकती हैं। नामों में रिक्त स्थान भी प्रतिबंधित हैं, इसलिए यह एक और बिंदु है जहां आपका अपेक्षित एक्सएमएल आउटपुट असफल हो जाएगा।

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