diff --git a/src/util/XMLString.cpp b/src/util/XMLString.cpp
index 8d124c3da6e4262452582ddfdc01beadd02805e5..430fec23eb392c096665a9c46a95ab7326b76bef 100644
--- a/src/util/XMLString.cpp
+++ b/src/util/XMLString.cpp
@@ -699,6 +699,46 @@ bool XMLString::isValidEncName(const XMLCh* const name)
     return true;
 }
 
+/**
+  * isValidQName
+  *
+  * [6]  QName ::=  (Prefix ':')? LocalPart 
+  * [7]  Prefix ::=  NCName 
+  * [8]  LocalPart ::=  NCName 
+  *
+  */
+bool XMLString::isValidQName(const XMLCh* const name)
+{
+    if (!name)
+        return false;
+
+    int strLen = XMLString::stringLen(name);
+    if (strLen == 0)
+        return false;
+
+    int colonPos = XMLString::indexOf(name, chColon);
+    if ((colonPos == 0) ||         // ":abcd"
+        (colonPos == strLen-1))    // "abcd:"
+        return false;
+
+    //
+    // prefix
+    //
+    if (colonPos != -1)
+    {
+        XMLCh *prefix = new XMLCh[colonPos+1];
+        XMLString::subString(prefix, name, 0, colonPos-1);
+        ArrayJanitor<XMLCh> janName(prefix);
+        if (XMLString::isValidNCName(prefix)==false)
+            return false;
+    }
+
+    //
+    // LocalPart
+    //
+    return XMLString::isValidNCName(name+colonPos+1);
+}
+
 bool XMLString::isAlpha(XMLCh const theChar)
 {
     if ((( theChar >= chLatin_a ) && ( theChar <= chLatin_z )) ||
diff --git a/src/util/XMLString.hpp b/src/util/XMLString.hpp
index 688486efc22dad127371cc994481b32d09b6aee1..114333eef953f00d98031436d4ae864c034a90c6 100644
--- a/src/util/XMLString.hpp
+++ b/src/util/XMLString.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.25  2001/07/06 20:27:57  peiyongz
+ * isValidaQName()
+ *
  * Revision 1.24  2001/07/04 14:38:20  peiyongz
  * IDDatatypeValidator: created
  * DatatypeValidatorFactory: IDDTV enabled
@@ -1047,6 +1050,13 @@ public:
       */
     static bool isValidEncName(const XMLCh* const name);  
 
+    /**
+      * Checks whether an name is a valid QName.
+      * @param name The string to check its QName validity
+      * @return Returns true if name is QName valid, otherwise false
+      */
+    static bool isValidQName(const XMLCh* const name);  
+
     /**
       * Checks whether a character is within [a-zA-Z].
       * @param theChar: the character to check