CREATE PROCEDURE dbo.SetHistoricPrices
AS
BEGIN
SET NOCOUNT ON;
DECLARE @minId INT
,@ProductId INT
,@CostPrice MONEY
,@daysToAdd INT
SET @daysToAdd =
(
CASE
WHEN DATEPART(dw, GETDATE()) = 1 THEN 5
WHEN DATEPART(dw, GETDATE()) = 2 THEN 4
WHEN DATEPART(dw, GETDATE()) = 3 THEN 3
WHEN DATEPART(dw, GETDATE()) = 4 THEN 2
WHEN DATEPART(dw, GETDATE()) = 5 THEN 1
WHEN DATEPART(dw, GETDATE()) = 6 THEN 0
WHEN DATEPART(dw, GETDATE()) = 7 THEN -1
END
)
SELECT
@minId = MIN(ProductId)
FROM Products p
WHILE @minId IS NOT NULL
BEGIN
SELECT
@ProductId = p.ProductId
FROM Products p
WHERE p.ProductId = @minId
SELECT
@CostPrice = p.CostPrice
FROM Products p
WHERE p.ProductId = @minId
INSERT INTO HistoricProductPrices
VALUES (@ProductId, DATEADD(DAY, @daysToAdd, GETDATE()), @CostPrice, DATEADD(DAY, 0, GETDATE()))
SELECT
@minId = MIN(ProductId)
FROM Products
WHERE @minId < ProductId
END
END
GO
这是我从第三方数据库中提取的简单信息。我们开始提出评论部分,其中包含&amp;和一些&lt;这是对xml构建的限制。错误是:
simplexml_load_file($htmlstring)
在尝试构建XML集之前,我怎样才能获得那些格式错误的结果和CDATA。我已经遍布http://php.net/manual/en/function.simplexml-load-file.php,但似乎没有聪明才能找到解决方案!
答案 0 :(得分:1)
如果输入文件无效,并且您无法影响第三方修复输入文件,则您的选项相当有限。
可能值得尝试的一件事是使用DOM in HTML mode加载文件。这使用了更宽容的解析器,但随后创建了相同的数据结构。
好的一点是,你实际上不必使用DOM的所有详细程度,因为你can "import" the DOM object into SimpleXML。这不需要任何重新解析,因为两个接口在内部使用相同的数据结构(libxml)。
从那里 - 假设这有效 - 你可以继续,就像你刚开始运行simplexml_load_file
一样。
所以不要这样:
$sxml = simplexml_load_file($file_path);
你写的是:
$dom = DOMDocument::loadHTMLFile($file_path);
$sxml = simplexml_import_dom($dom);
然后按原样继续。
(如果您有一串数据而不是文件路径,则分别使用simplexml_load_string()
和DOMDocument::loadHTML()
。)