diff --git a/Text/HTML/DOM.hs b/Text/HTML/DOM.hs
--- a/Text/HTML/DOM.hs
+++ b/Text/HTML/DOM.hs
@@ -43,6 +43,10 @@
         mx <- await
         case fmap (entities . fmap' (decodeUtf8With lenientDecode)) mx of
             Nothing -> closeStack stack
+
+            -- Ignore processing instructions (or pseudo-instructions)
+            Just (TS.TagOpen local _ _) | "?" `T.isPrefixOf` local -> go stack
+
             Just (TS.TagOpen local attrs isClosed) -> do
                 let name = toName local
                     attrs' = map (toName *** return . XT.ContentText) attrs
diff --git a/html-conduit.cabal b/html-conduit.cabal
--- a/html-conduit.cabal
+++ b/html-conduit.cabal
@@ -1,5 +1,5 @@
 Name:                html-conduit
-Version:             1.1.0.4
+Version:             1.1.0.5
 Synopsis:            Parse HTML documents using xml-conduit datatypes.
 Description:         This package uses tagstream-conduit for its parser. It automatically balances mismatched tags, so that there shouldn't be any parse failures. It does not handle a full HTML document rendering, such as adding missing html and head tags.
 Homepage:            https://github.com/snoyberg/xml
diff --git a/test/main.hs b/test/main.hs
--- a/test/main.hs
+++ b/test/main.hs
@@ -54,6 +54,20 @@
                         ]
                     ]
              in H.parseLBS html @?= doc
+        it "XHTML with doctype and <?xml #30" $ do
+            let html = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html><head><title>foo</title></head><body><p>Hello World</p></body></html>"
+                doc = X.Document (X.Prologue [] Nothing []) root []
+                root = X.Element "html" Map.empty
+                    [ X.NodeElement $ X.Element "head" Map.empty
+                        [ X.NodeElement $ X.Element "title" Map.empty
+                            [X.NodeContent "foo"]
+                        ]
+                    , X.NodeElement $ X.Element "body" Map.empty
+                        [ X.NodeElement $ X.Element "p" Map.empty
+                            [X.NodeContent "Hello World"]
+                        ]
+                    ]
+             in H.parseLBS html @?= doc
         it "HTML" $
             let html = "<html><head><title>foo</title></head><body><br><p>Hello World</p></body></html>"
                 doc = X.Document (X.Prologue [] Nothing []) root []
